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



我有一个以下格式的 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);

我有驱动程序大师类创建为-

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

反序列化行给出未经处理的异常,我知道我以错误的方式这样做,因为如果不在 c# 中记录数字 1,2,3...n 的操作,就无法将 DriverMaster json 对象直接提取到 c# 中。谁能帮我解决一下?提前谢谢。

你很接近:

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

溶液。
更改您的代码以使用...

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>类型。

对于这些类型的事情,我喜欢使用经常被忽视的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.. 等相关的值......这是另一个SO答案,显示了SelectTokens方法的更复杂的用法。

你需要使用

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 

相关内容

  • 没有找到相关文章

最新更新