2

私は OpenCalais の API を使用しています。この API は、多数の JSON オブジェクトを含む json 文字列を提供します。問題は、API に渡す内容に応じて JSON 文字列の構造が変化することです。つまり、作成できるカスタム クラスに対して非シリアル化をキャストすることはできません。もう 1 つの問題は、出力がキー値形式ではなく、複雑なオブジェクト構造になっていることです。出力の例を次に示します。

{"doc":
{"info":
{"allowDistribution":"true",
"allowSearch":"true",
"calaisRequestID":"c1cdd79a-ed89-8431-138c-50e8a37100f9",
"externalID":"17cabs901",
"id":"http://id.opencalais.com/0RCcU306*HTR05*7HlUb5A",
"docId":"http://d.opencalais.com/dochash-1/6188237f-a2a5-3263-95b7-ea894ba98298",
"document":"Bill Gates worked at Microsoft from 2008 to 2011. He is also married to Melinda Gates.",
"docTitle":"",
"docDate":"2012-07-26 15:51:00.885",
"externalMetadata":"",
"submitter":"ABC"}

したがって、ここには複数のレベルのオブジェクトがあり、キーと値の構造がないことがわかります。このコードから必要なのは、基本的に辞書内のすべての名前/値情報です。次に、関連情報のキーに基づいて並べ替えることができます。どうにかしてオブジェクト値の親も取得できれば素晴らしいと思います。たとえば、必要な出力は、key: allowSearch、value: true、parent: info です。私は逆シリアル化、動的オブジェクト、および .Ancestor のような関数を使用した単純な解析のさまざまな方法をいじろうとしてきましたが、有用なものは何も見つかりませんでした。どんな助けでも大歓迎です。

4

3 に答える 3

3

JSON.NETを見たことがありますか?JSONを動的に解析し、それを反復処理できます。

using Newtonsoft.Json.Linq;

JObject rootObject = JObject.Parse(jsonString);

子を反復処理するか、次のような他のノードを検索できます。

JToken info = rootObject.SelectToken("info");
于 2012-07-30T15:55:47.927 に答える
1

Json.NETは名前空間でLINQ to JSONをサポートします。Newtonsoft.Json.Linq

使用JObject

JObject o = JObject.Parse(@"{'CPU': 'Intel','Drives': ['DVD read/writer','500 gigabyte hard drive']}");

string cpu = (string)o["CPU"];
// Intel

string firstDrive = (string)o["Drives"][0];
// DVD read/writer

IList<string> allDrives = o["Drives"].Select(t => (string)t).ToList();
// DVD read/writer
// 500 gigabyte hard drive
于 2013-08-20T11:59:33.750 に答える
0

基本的に を返すDeserializeObjectを使用できますDictionary<string, object>

例えば:

JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> myGraph = (Dictionary<string, object>)serializer.DeserializeObject(myJson);

辞書から何かを読み取るmyGraphには、途中で各ステップをキャストする必要があります。

例えば:

Dictionary<string, object> doc = (Dictionary<string, object>)myGraph["doc"];
Dictionary<string, object> info = (Dictionary<string, object>)doc["info"];
string externalID = (string)info["externalID"];

少し一般化できると思いますが、投稿したjsonで機能するはずです。

于 2012-07-30T15:44:04.413 に答える