【问题标题】:Deserialize JSON string in to multiple C# objects将 JSON 字符串反序列化为多个 C# 对象
【发布时间】:2019-05-30 22:47:28
【问题描述】:

我有一个以下格式的 JSON 字符串,我想将其反序列化为 C# 列表。但是 JSON 中的记录号“1”、“2”、“3”(最多可达 1,2,3...n 取决于每次的 json 响应)限制我反序列化使用 Newtonsoft.Json 将其转换为 C# 对象

{
"1":{
      "UID":"1",
      "LICENCENO":"licenseno",
      "NAME":"ABC"
    },
"2":{
      "UID":"2",
      "LICENCENO":"licenseno",
      "NAME":"PQR"
    },
"3":{
      "UID":"3",
      "LICENCENO":"licenseno",
      "NAME":"XYZ"      
    }
}

我正在使用下面的代码进行反序列化

var result = Newtonsoft.Json.JsonConvert.DeserializeObject<List<DriverMaster>>(json);

我创建了 DriverMaster 类-

public class DriverMaster
{
    public string UID { get; set; }
    public string LICENCENO { get; set; }
    public string NAME { get; set; }
}

反序列化行给出未处理的异常,我知道我做错了,因为 DriverMaster json 对象无法直接提取到 c# 中而不做 something 以记录编号 1,2,3 ...n 在 c# 中。谁能帮我解决一下?提前致谢。

【问题讨论】:

    标签: c# json json.net deserialization


    【解决方案1】:

    你很亲密:

    var result = JsonConvert.DeserializeObject<Dictionary<string, DriverMaster>>(json)
        .Select(x => x.Value)
        .ToList();
    

    【讨论】:

      【解决方案2】:

      解决方案。
      更改您的代码以使用...

      var result = JsonConvert.DeserializeObject<Dictionary<int, DriverMaster>>(json);
      

      说明

      类型不一样...List&lt;DriverMaster&gt;type 会像这样转换为 JSON...

      {
          "1":
          {
              "DriverMaster": {
                  "UID":"1",
                  "LICENCENO":"licenseno",
                  "NAME":"ABC"
              }
          }
      }
      

      这与您在问题中显示的内容不符...

      您要查找的类型实际上是Dictionary&lt;int, DriverMaster&gt;,它是一个键/值对,会像这样输出一个 JSON 字符串

      {
          "1": { ... },
          "2": { ... },
          "3": { ... }
      }
      

      为了解决这个问题,您需要改用Dictionary&lt;int, DriverMaster&gt; 类型。

      【讨论】:

        【解决方案3】:

        对于这些类型的事情,我喜欢使用经常被忽视的JToken.SelectTokens 功能。此函数允许您在 json 字符串中选择标记并允许使用通配符。

        这里有一些代码将通过选择 json 中的 1,2,3...N 来反序列化您的示例:

        public static IEnumerable<DriverMaster> Deserialize(string json)
        {
            return JToken.Parse(json).SelectTokens("*")
                .Select(jToken => jToken.ToObject<DriverMaster>());
        }
        

        * 基本上说选择根之后的所有标记,因此它选择与 1、2、3.. 等相关的值...这是another SO 答案,它显示了 @ 的更复杂用法987654326@方法。

        【讨论】:

          【解决方案4】:

          你需要使用

          public class DriverMaster
          {
              public string UID { get; set; }
              public string LICENCENO { get; set; }
              public string NAME { get; set; }
          }
          
          public class Root
          {
              [JsonExtensionData]
              public IDictionary<string,JToken> Data {get;set;}
          }
          

          var result = Newtonsoft.Json.JsonConvert.DeserializeObject<Root>(json);
          

          如果要将结果作为List,可以将结果解析为。

          var list = new List<DriverMaster>();
          foreach(KeyValuePair<string, JToken> token in result.Data)
          {
              list.Add(token.Value.ToObject<DriverMaster>());
          }
          

          这会给你想要的结果

          1 licenseno ABC 
          2 licenseno PQR 
          3 licenseno XYZ 
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-04-27
            • 1970-01-01
            • 1970-01-01
            • 2021-07-28
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多