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

时间:2019-01-04 10:59:33

标签: c# json json.net deserialization

我有以下格式的JSON字符串,我想将其反序列化为C#List。但是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; }
}

反序列化行给出了未处理的异常,我知道我这样做的方式是错误的,因为不执行 来记录数字 1,2,3,DriverMaster json对象无法直接提取到c#中... n 在C#中。谁能帮我解决一下吗?预先感谢。

4 个答案:

答案 0 :(得分:6)

您很亲密:

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

答案 1 :(得分:2)

  

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

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

说明

类型不同... List<DriverMaster>类型将像这样转换为JSON ...

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

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

您要查找的类型实际上是Dictionary<int, DriverMaster>,它是一个键/值对,将像这样输出JSON字符串

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

要解决此问题,您需要改用Dictionary<int, DriverMaster>类型。

答案 2 :(得分:1)

您需要使用

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

如果要将结果作为列表,则可以将结果解析为。

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 

答案 3 :(得分:0)

对于这些类型的事情,我喜欢使用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的答案,它显示了更复杂的SelectTokens方法的用法。