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