2017-07-14 24 views
0

我打電話給webservice,它以下面的格式返回json中的響應。在c中解析一個動態變化的json文件#

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

以上的迴應是當父母只有一個孩子。但是,當有在母體一個以上的孩子,則響應如下所示:

{ 
    "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"]; 
} 

是否有任何其他方法,我們可以得到值1,不檢查父是否JObject或JArray?

+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"); 

或者你可以使用SelectTokens()與服用可選數組索引的地方JSONPath遞歸下降操作..

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

樣品fiddle

(關於如何處理這種多態JSON的出現往往問題;例如見How to handle both a single item and an array for the same property using JSON.net一種方式來反序列化JSON像這樣固定的POCO類型)