Json.NET プロジェクトは、.NET用のJSONフレームワークのバージョン4.5を出した。これには多くの新フィーチャと劇的なスピード改善がある。InfoQは、最近 Json.NETのクリエーターである、 James Newton-King氏に新リリースとプロジェクトの全体について聞いた。
InfoQ: 最近の2つのメジャーリリース (Json.NET 4.0 と 4.5)の中で、何が最も嬉しいフィーチャですか?
James Newton-King:Json.NET 4.0では、動的サポートが嬉しいですね、.NET 4.0のお陰で、私は提供することが出来ました。私が喜んで追加したフィーチャのほとんどは、学ぶと同時に実装したものです。例えば、 JObject/JArray/JValueに IDynamicMetaObjectProviderを実装(は、私が現行バージョンにプラスになって欲しいと思ったように、間違いなく良い学習経験になった)し、同時にそれを別にしたので、動的フィーチャは、 Json.NETがサポートする古い.NETビルドから除外することができました。
ISO 8601の日付フォーマットを Json.NETにおけるデフォルトの日付シリアル化フォーマットにしたのが、私の気に入っている Json.NET 4.5フィーチャです。JSONの日付は、私にとって宿敵のようなものでした。 Json.NETは Microsoftの日付フォーマットを始めから使っていますが、私はそれが嫌いなのです。JSONライブラリの非 Microsoftプラットフォームにおける相互運用性は、明らかに問題でしたが、私にとってもっと大きいのは、日付が簡単に読めない事でした。コードをデバッグする開発者にとって、ISOフォーマットの"2009-02-15T00:00:00Z" の方が、 Microsoftの古いフォーマットの"\/Date(1198908717056)\/"よりもはるかに読みやすいです。驚くことに、この最近変更を、誰一人として文句の言うものはいません、文句があるなら明らかにしなければなりませんが、 .NET開発者は気に入っているのです。
InfoQ: 将来のリリースで追加したい主要なフィーチャは何ですか?(Codeplexのあなたのフィーチャリストには、 JSON 再帰限度 (Recursion Limit)サポートが載ってますが、これだけですか?)
J.N.K. - JSON 再帰限度のサポートを追加する理由が2つあります。一つは、 Microsoft JSONシリアライザがそれをサポートし、私は彼らがサポートするもので、役に立つと思うものはサポートしたいのです。もしエンドポイントを公開し、それをロックダウンしたければ、限度を設けることは役に立ちます。もうひとつは、ASP.NET MVCチームが Web APIでそれを使うからです。現在、彼らはそれを自分達で実装していますが、追加するのが非常に容易なフィーチャであり、私は Web APIがJSONと連携する方法と出来るだけ同じように、単純に Json.NETをJSONと連携させたいと考えています。
Json.NETに新しいフィーチャを加えることについては、全く考えていません。私がしたいことは、 Json.NETの開発者が StackOverflowのような質問をサイトに投げてくるのか、どんなバグを報告してくるのかをまず見て、それからもっと使いやすくする方法を考えたいですね。時々、それが新しいフィーチャとなりますが、それとは別にドキュメントを改善して、すでに実際には開発者にできることを知らせることも必要です。
InfoQ: 「素晴らしいバグ修正で、パフォーマンステストが70,000%も早くなった」とあなたは言ってますが、これについてよく説明してくれませんか?
J.N.K. - Microsoftの開発者による Json.NETのストレステストによって、 100,000のネストしたLINQへの配列をJSONオブジェクトにデシリアライズすると、あり得ないようなとんでもなく長い時間かかっりました。このひどいパフォーマンスの理由は、LINQ to JSONオブジェクトが再帰的なループをチェックするためです。すなわち1つの配列は自部自身の親ではありませんし、新しいネストされたデシリアライズする度に、自分の全ての親をチェックする必要があるので、例えば配列 90,001は、 90,000ヶの親を、配列 90,002は、 90,001ヶの親を、等々です。明らかにまずいわけです。
解決は至って簡単です。追加されるアイテムに子供がいるかどうかをチェックします。もし配列に子供がいなければ、自身の親ではあり得ないので、再帰的な親のチェックはスキップします。1行のコード変更で43秒から63ミリ秒に劇的に改善したのです。
InfoQ: リリース 4.0-6は、.NETフレームワークオプションと比べて、パフォーマンスの優位性を強調しています。 Json.NETのパフォー マンスは、全体的なフィーチャセットと比べてどのくらい重要だ、と考えていますか?
あらゆる開発者は、開発者の生産性を改善するようなフィーチャから恩恵を得ますが、一部の人は極端にパフォーマンスを求めます。両方のバランスが重要です。私は必ず、 Json.NETを.NETフレームワークのシリアライザより早くしますし、もっとフィーチャを提供します。
InfoQ: James Newton-Kingさんお時間をありがとうございました。全フィーチャの完全な情報は、このアナウンスにあり、全プロジェクトフィーチャの要約はCodeplexサイトにある。