将 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<DriverMaster>
type 会像这样转换为 JSON...
"1":
"DriverMaster":
"UID":"1",
"LICENCENO":"licenseno",
"NAME":"ABC"
这与您在问题中显示的内容不符...
您要查找的类型实际上是Dictionary<int, DriverMaster>
,它是一个键/值对,会像这样输出一个 JSON 字符串
"1": ... ,
"2": ... ,
"3": ...
为了解决这个问题,您需要改用Dictionary<int, DriverMaster>
类型。
【讨论】:
【参考方案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 将文件反序列化为对象列表失败,并将字符串转换为集合错误