4

以下は私の JSON データで、たまたま Wikidata が提供する形式ですが、わかりやすくするために大幅に削除されています。

{
"entities": {
    "Q200405": {
        "id": "Q200405",
        "type": "item",
        "claims": "Cheese"
        }
    }
}

C# 内でこのデータにアクセスしようとしています。私の問題は、Q200405 が動的であることです。これは基本的に、取得しているレコード番号です。たとえば、別のページで

{
"entities": {
    "Q123456": {
        "id": "Q123456",
        "type": "item",
        "claims": "Lemon"
        }
    }
}

これまでの私の最善の試みは、Json.NET (Newtonsoft) を使用することでした。

json = "{\"entities\":{\"Q200405\" {\"id\":\"Q200405\",\"type\":\"item\",\"claims\":\"Cheese\"}}}";

var Query = JsonConvert.DeserializeObject<dynamic>(json);
string entities = Query.entities.ToString();

Query = JsonConvert.DeserializeObject<dynamic>(entities);
string entity = Query.Q200405.ToString();

Query = JsonConvert.DeserializeObject<dynamic>(entity);
string id = Query.id.ToString();
string claims = Query.claims.ToString();

これは機能しますが、明らかにハードコーディングQuery.Q200405.ToString()は理想的なソリューションではありません! データにドリルダウンするために複数の Deserialize ステートメントを実行するべきではないでしょうか?

私の質問は、上記の JSON 形式を ac# プログラムに読み込む最良の方法は何ですか?

4

2 に答える 2

7

名前を文字列変数に入れたい場合は、次を使用しますJObject

string id = "Q200405"; // Or wherever you get that from
string text = "{\"entities...";
var json = JObject.Parse(text);

var claim = json["entities"][id];

string claims = (string) claim["claims"];
string type = (string) claim["type"];
// etc

基本的に、LINQ to JSON は本当に必要なものです。

編集:事前にIDがわからない場合は、次を使用できます。

var json = JObject.Parse(text);
var entities = (JObject) json["entities"];
var entity = entities.Properties().First();
var id = entity.Name;
var claim = (JObject) entity.Value;
string claims = (string) claim["claims"];
string type = (string) claim["type"];
Console.WriteLine(new { claims, type, id });
于 2014-12-18T23:14:58.043 に答える
2

これはあなたがそれを解析する方法です

class Data
{
    public string id { get; set; }
    public string type { get; set; }
    public string claims { get; set; }
}

var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string,Data>>>(json);
Data data = obj["entities"].FirstOrDefault().Value;
于 2014-12-18T23:46:44.340 に答える