次のJSon文字列がサービスから返されました。
{
"links": {
"data": {
"self": {
"body": "",
"content_type": "",
"href": "",
"method": "GET",
"name": ""
}
}
},
"results": [{
"data": {
"categories": {
"41370_10": "abc",
"41370_11": "abc",
"41370_2": "abc",
"41370_5": "abc"
}
},
"metadata": {
"categories": {
"41370": {
"key": "41370",
"name": "123"
},
"41370_10": {
"bulk_shared": false,
"key": "41370_10",
"name": "some name"
},
"41370_11": {
"allow_undefined": false,
"key": "41370_11",
"name": "some name 2"
},
"41370_2": {
"key": "41370_2",
"key_value_pairs": false,
"name": "some name 3"
}
}
}
},
{
"data": {
"categories": {
"72051_2": "asd",
"72051_3": "asd"
}
},
"metadata": {
"categories": {
"72051": {
"key": "72051",
"name": "some name 4"
},
"72051_2": {
"key": "72051_2",
"name": "some name 5"
}
}
}
},
{
"data": {
"categories": {
"112644_2": "zxc"
}
},
"metadata": {
"categories": {
"112644": {
"key": "112644",
"name": "some name 6"
},
"112644_2": {
"hidden": false,
"key": "112644_2",
"name": "some name 7"
}
}
}
}]
}
このデータを処理して、わかりやすい辞書を取得するにはどうすればよいですか?次のようになります。
{"some name", "abc"},
{"some name 2", "abc"},
{"some name 3", "abc"},
{"some name 5", "asd"},
{"some name 6", "zxc"}
現在、c#、json.netを使用しようとしていますが、ほとんど成功していません。どんな助けでも大歓迎です。
更新1:JTokenを取得するところまでは到達しましたが、データをメタデータから分離する方法がわかりません(はい、それがいかに馬鹿げているかわかります)。
//get json object
JObject cjob = JObject.Parse(response.Content.ReadAsStringAsync().Result);
IEnumerable<JToken> categorymetadata = cjob.Descendants()
.Where(t => t.Type == JTokenType.Property && ((JProperty)t).Name == "categories")
.SelectMany(p => ((JProperty)p).Value);
次のLINQ-to-JSONクエリは、探している結果を提供するはずです。
Dictionary<string, string> dict = cjob["results"]
.Children<JObject>()
.Select(result => result.SelectToken("metadata.categories").Children<JProperty>()
.Join(result.SelectToken("data.categories").Children<JProperty>(),
metaCat => metaCat.Name,
dataCat => dataCat.Name,
(metaCat, dataCat) => new
{
Name = (string)metaCat.Value["name"],
Value = (string)dataCat.Value
}
)
)
.SelectMany(a => a)
.ToDictionary(a => a.Name, a => a.Value);
foreach (var kvp in dict)
{
Console.WriteLine(kvp.Key + ": " + kvp.Value);
}
これにより、各結果metadata
のdata
オブジェクト内のカテゴリとオブジェクト内のカテゴリの間で内部結合が行われ、結合されたプロパティが匿名の名前と値のペアのリスト(実際にはIEnumerable)に選択されます。次に、ペアのリストは1つのリストにフラット化され、最終的に辞書に配置されます。
私はあなたのデータについて以下の仮定をしています:
これらの仮定が成り立たない場合は、エラーが発生し、コードを調整する必要があります。
これが実際のデモです:https://dotnetfiddle.net/WkztV5
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加