Newtonsoft JSON - 不同的JSON结构,对象与数组[重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Newtonsoft JSON - 不同的JSON结构,对象与数组[重复]相关的知识,希望对你有一定的参考价值。

我有这个JSON结构:

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

我正试图用using Newtonsoft.Json;中的C#对它进行反序列化。 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设置为List,则只有当响应中的所有项都是“key3”时才有效:“TYPE_TWO”。

我可以配置Newtonsoft解析器解析数组,如果它有数组或对象,如果它有对象?

答案

简短回答 - 如果可以避免,请不要这样做。通过为阵列提供不同的密钥名称,您可以节省大量的复杂性。

答案很长,你可以做到,但这很痛苦。如果有人知道如何处理没有重新序列化生成的j对象(即保持json与反序列化对象并排),我很想知道:

private static readonly string Json = "[
  {
    "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"
          }
        ]
      }
    }
  }
]";

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; }
}

以上是关于Newtonsoft JSON - 不同的JSON结构,对象与数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Newtonsoft JSON - 不同的JSON结构,对象与数组[重复]

再谈Newtonsoft.Json高级用法

Newtonsoft.Json的使用整理

.NET NewtonSoft JSON 反序列化映射到不同的属性名称

Newtonsoft.Json的使用整理

Newtonsoft Json.NET 版本不兼容(DLL 地狱)