我有以下格式的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#中。谁能帮我解决一下吗?预先感谢。
答案 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
方法的用法。