2017-12-18 219 views
0

我有這樣的JSON結構:Newtonsoft JSON - 不同的JSON結構,對象VS陣列

[ 
    { 
    "key1": "value", 
    "key2": "value", 
    "key3": "TYPE_ONE", 
    "extraData": { 
     "key4": "value", 
     "key5": "value", 
     "key6": { 
     "key7": { 
      "key8": "value", 
      "key9": "value", 
      "key10": "value" 
     } 
     } 
    } 
    }, 
    { 
    "key1": "value", 
    "key2": "value", 
    "key3": "TYPE_TWO", 
    "extraData": { 
     "key4": "value", 
     "key5": "value", 
     "key6": { 
     "key7": [ 
      { 
      "key8": "value", 
      "key9": "value", 
      "key10": "value" 
      }, 
      { 
      "key8": "value1", 
      "key9": "value1", 
      "key10": "value1" 
      }, 
      { 
      "key8": "value2", 
      "key9": "value2", 
      "key10": "value2" 
      } 
     ] 
     } 
    } 
    } 
] 

我想在C#using Newtonsoft.Json;到反序列化。 JSON有兩種結構。
1. CASE - >當「key3」:「TYPE_ONE」時,則key7是對象。
2. CASE - >當「key3」:「TYPE_TWO」時,則key7爲數組。
如果在課堂上

public class key6 
{ 
    public key7 key7Item { get; set; } 
} 

key7Item設置爲對象的工作只有當我得到的所有對象從反應是 「KEY3」: 「TYPE_ONE」
如果我設置key7Item列表然後才工作,如果來自響應的所有項目是「key3」:「TYPE_TWO」。

我可以配置Newtonsoft分析器來解析數組,如果它有數組或對象,如果它有對象?

+0

如果您有需要兩個JSON結構兩個班代表他們。否則,無論使用'key3'如何使用相同的結構,只需使用數組中的單個項目即可。 –

+0

@CamiloTerevinto如何告訴解析器將key7 allways解析爲數組,即使作爲對象返回? 或者,在其他情況下,如何告訴解析器根據key3使用不同的類? – zonelsk

+0

是的,您可以使用'SingleOrArrayConverter '如[如何使用JSON.net處理同一個屬性的單個項目和陣列](https://stackoverflow.com/q/18994685/10263)中所示。使用'key7'作爲'T'而不是'string'。 –

回答

1

簡短的回答 - 如果你可以避免它,不要這樣做。通過爲陣列提供不同的密鑰名稱,可以節省大量複雜性。

很長的答案,你可以做到,但它很痛苦。如果有人知道如何做,而無需重新序列化所生成的J-對象(即保持旁邊的反序列化對象的JSON),我很想知道:

private static readonly string Json = "[\r\n {\r\n \"key1\": \"value\",\r\n \"key2\": \"value\",\r\n \"key3\": \"TYPE_ONE\",\r\n \"extraData\": {\r\n  \"key4\": \"value\",\r\n  \"key5\": \"value\",\r\n  \"key6\": {\r\n  \"key7\": {\r\n   \"key8\": \"value\",\r\n   \"key9\": \"value\",\r\n   \"key10\": \"value\"\r\n  }\r\n  }\r\n }\r\n },\r\n {\r\n \"key1\": \"value\",\r\n \"key2\": \"value\",\r\n \"key3\": \"TYPE_TWO\",\r\n \"extraData\": {\r\n  \"key4\": \"value\",\r\n  \"key5\": \"value\",\r\n  \"key6\": {\r\n  \"key7\": [\r\n   {\r\n   \"key8\": \"value\",\r\n   \"key9\": \"value\",\r\n   \"key10\": \"value\"\r\n   },\r\n   {\r\n   \"key8\": \"value1\",\r\n   \"key9\": \"value1\",\r\n   \"key10\": \"value1\"\r\n   },\r\n   {\r\n   \"key8\": \"value2\",\r\n   \"key9\": \"value2\",\r\n   \"key10\": \"value2\"\r\n   }\r\n  ]\r\n  }\r\n }\r\n }\r\n]"; 

private static void Deserialize() 
{ 
    var switchers = JsonConvert.DeserializeObject<JObject[]>(Json); 
    var deserializedType1List = new List<TargetClass<Key6Type1>>(); 
    var deserializedType2List = new List<TargetClass<Key6Type2>>(); 
    foreach (var switcher in switchers) 
    { 
     if (switcher["key3"].Value<string>() == "TYPE_ONE") 
     { 
      deserializedType1List.Add(JsonConvert.DeserializeObject<TargetClass<Key6Type1>>(JsonConvert.SerializeObject(switcher))); 
     } 
     else 
     { 
      deserializedType2List.Add(JsonConvert.DeserializeObject<TargetClass<Key6Type2>>(JsonConvert.SerializeObject(switcher))); 
     } 
    } 

    //Do something with the objects... 
} 

private class TargetClass<TKey6Type> 
{ 
    public string key1 { get; set; } 

    public string key2 { get; set; } 

    public string key3 { get; set; } 

    public ExtraData<TKey6Type> extraData { get; set; } 
} 

private class ExtraData<TKey6Type> 
{ 
    public string key4 { get; set; } 

    public string key5 { get; set; } 

    public TKey6Type key6 { get; set; } 
} 

private class Key6Type2 
{ 
    public Key7[] key7 { get; set; } 
} 

private class Key6Type1 
{ 
    public Key7 key7 { get; set; } 
} 

private class Key7 
{ 
    public string key8 { get; set; } 
    public string key9 { get; set; } 
    public string key10 { get; set; } 
}