将 JSON 字符串反序列化为多个 C# 对象

Posted

技术标签:

【中文标题】将 JSON 字符串反序列化为多个 C# 对象【英文标题】:Deserialize JSON string in to multiple C# objects 【发布时间】: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# 中。谁能帮我解决一下?提前致谢。

【问题讨论】:

【参考方案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 

【讨论】:

以上是关于将 JSON 字符串反序列化为多个 C# 对象的主要内容,如果未能解决你的问题,请参考以下文章

C# JSON 将文件反序列化为对象列表失败,并将字符串转换为集合错误

将 JSON 反序列化为 C# 对象以在网格中将嵌套数组显示为字符串

在调用API后,将JSON对象反序列化为C#类[重复]。

如何在 C# 中反序列化多个 JSON 对象?

无法将 JSON 数组反序列化为 C# 对象 [关闭]

将嵌套的 JSON 反序列化为 C# 对象