2017-07-14 12 views
0

jsonの応答を次の形式で返すwebserviceを呼び出しています。動的に変化するjsonファイルをC#で解析する

{ 
    "parent": 
    { 
     "child": { 
     "key1": value1, 
     "key2": value2 
     } 
    } 
} 

上記の応答は、親に1人の子供がいる場合です。しかし、親に複数の子がある場合に示すように、応答があり、そして:

{ 
    "parent": [ 
    { 
     "child": { 
     "key1": "value1", 
     "key2": "value2" 
     } 
    }, 
    { 

     "child": { 
     "key1": "value1", 
     "key2": "value2" 
     } 
    } 
    ] 
} 

つ以上の子要素が存在する場合にこのように、親がJArrayであり、唯一の子要素がある場合には、親JObjectです。

今、JObjectのときにインデックスのエラーをスローするので、子要素の内容を動的に解析するのが難しいです。

誰かがJObjectとJArrayの両方で内容をどのように解析できるか説明できますか?

現在のところ、親タグをJObject/JArrayであるかどうか、それに対応して解析しているかどうかをチェックしていますが、それは長くて退屈なプロセスです。

他の方法がありますか?続き

は、私が今

if(jsonfile["parent"].getType() == "JObject") 
{ 
    string value1 = (string)jsonfile["parent"]["child"]["key1"] 
} 
else 
{ 
    string value1 = (string)jsonfile["parent"][0]["child"]["key1"]; 
} 

使用していたコード私達は親がJOBJECTかJArrayであるかどうかを確認せずにVALUE1を得ることができ、他の方法がありますか?

+0

あなたがいる場合は、json.netをタグ付けそれを実際に使用すると、jsonをオブジェクトに変換して処理するほうがはるかに簡単です(http://www.newtonsoft.com/json/help/html/DeserializeObject.htm)。この質問も参照してください:https://stackoverflow.com/questions/4535840/deserialize-json-object-into-dynamic-object-using-json-net – Esko

+0

childXプロパティは変更されません。私は間違いを訂正しました。 – Dipumon

+0

JSONをc#クラスまたは?クラスに解析しますか? –

答えて

0

あなたは、このような

public static class JsonExtensions 
{ 
    public static IEnumerable<JToken> SingleOrArrayItems(this JToken source) 
    { 
     if (source == null || source.Type == JTokenType.Null) 
      return Enumerable.Empty<JToken>(); 
     IEnumerable<JToken> arr = source as JArray; 
     return arr ?? new[] { source }; 
    } 
} 

として拡張メソッドを紹介し、それから行うことができます:

var child = jsonfile["parent"].SingleOrArrayItems().FirstOrDefault(); 
var value1 = child == null ? null : child.SelectToken("child.key1"); 

それとも、オプションの配列のインデックスの場所を取ってJSONPath再帰下降演算子..SelectTokens()を使用することができます:

var value1 = jsonfile.SelectTokens("parent..child.key1").FirstOrDefault(); 

サンプルfiddle

(多型JSONのこの種を処理する方法についての質問がかなり頻繁に現れ、固定POCOタイプにこのようにJSONをデシリアライズする方法をインスタンスHow to handle both a single item and an array for the same property using JSON.netを参照。)

関連する問題