9

JSONでのC# の使用に関するほぼすべての質問に対する答えは、「JSON.NET を使用する」であるように思われますが、それは私が探している答えではありません。

私がそう言う理由は、私がドキュメントで読むことができたすべてのものから、JSON.NET は基本的に、.NET フレームワークに組み込まれた DataContractSerializer のより優れたパフォーマンスのバージョンであるということです...

つまり、JSON 文字列をデシリアライズしたい場合は、すべてのリクエストに対して厳密に型指定された完全なクラスを定義する必要があります。したがって、カテゴリ、投稿、作成者、タグなどを取得する必要がある場合は、これらすべてに対して新しいクラスを定義する必要があります。

クライアントを構築し、フィールドが何であるかを正確に知っている場合、これは問題ありませんが、他の誰かの API を使用しているため、サンプルの応答文字列をダウンロードして JSON 文字列から手動でクラスを作成しない限り、コントラクトが何であるかわかりません。 .

それが唯一の方法ですか?json["propertyname"] で読み取ることができる一種のハッシュテーブルを作成する方法はありませんか?

最後に、自分でクラスを作成しなければならない場合、API が変更され、変更が通知されない場合はどうなりますか (Twitter では悪名高いようです)。入ってオブジェクトのプロパティを更新するまで、プロジェクト全体が壊れると思います...

では、JSON を扱うときの一般的なワークフローとは正確にはどのようなものでしょうか? そして、一般的には、ライブラリに依存しないことを意味します。特にターゲットライブラリに対してではなく、一般的にどのように行われるかを知りたい...

4

2 に答える 2

5

json をどのように扱うかは使用するライブラリに依存するため、ライブラリに依存しないことは非常に困難です。JSON.NET 内の例として、JSON を操作する方法は複数あります。オブジェクトへの直接シリアル化について話している方法があります。これはタイプセーフですが、API からのデータが変更されると壊れます。ただし、質問で要求したように JObject["key"] を実行する方法を提供する JObject (XElement とかなり同様に動作する) を提供する LINQ-to-JSON もあります。C# 内で JSON を柔軟に操作する方法を探しているだけなら、JSON.NET の LINQ-to-JSON を調べてください。

実際には、どのようにしても、API が変更されると、コードが壊れる可能性があります。厳密にハッシュテーブル ベースのアプローチを使用している場合でも、返されるデータが変更されるとコードが壊れる可能性があります。

編集

JSON.NET ドキュメント

例を確認すると、2 番目の例で LINQ-to-JSON の動作の良い例が得られるはずです。クラスを定義せずに操作できます。すべてが標準フレームワーク クラス (ほとんどのコレクションと文字列) に変換されます。これにより、クラスを維持する必要がなくなります。

于 2010-06-01T15:30:23.347 に答える
0

私は 10 年以上 Perl 開発者として働いており、最近 C# を使い始めました。Java が好きすぎて驚いていますが (Java はまったく好きではありません)、最も難しい認知スイッチの 1 つは、「すべてを文字列として扱うことができ、言語が変換を処理する」から「事前に Java を処理する」への移行です。 -あなたのタイプを定義してください。」この場合、文字列思考が有利になる可能性があります。これは、求めている種類の API に対して実行する必要があるためです。

構文を理解する JSON パーサーを作成する必要があります。構文は非常に単純です: コンマ区切りのリスト、キーと値のペア、ハッシュ/オブジェクトの {}、配列の []、および引用符/エスケープ コンストラクト。JSON のトップレベルのエンティティは常にオブジェクトであるため、最初に Hashtable を作成してから、JSON 文字列を 1 文字ずつスキャンする必要があります。キーと値のペアを引き出します。値が { で始まる場合は新しい Hashtable として追加し、[ で始まる場合は新しい ArrayList として追加し、それ以外の場合は文字列として追加します。{ または [ を取得した場合は、子データ要素を追加するために再帰的に下降する必要があります。

.NET に優れた再帰降下パーサーがある場合は、おそらくそれを使用してジョブを単純化または堅牢化することができますが、JSON は十分に単純なので、これを適切かつ合理的に完了できる演習にすることができます。

于 2010-06-01T16:17:35.200 に答える