尝试使用 JSON.NET 反序列化带有 [] 字符的 JSON
Posted
技术标签:
【中文标题】尝试使用 JSON.NET 反序列化带有 [] 字符的 JSON【英文标题】:Trying to deserialize JSON with surrounding [] characters usig JSON.NET 【发布时间】:2020-01-02 15:04:42 【问题描述】:我正在使用 .NET 4.7、C#、JSON.NET、MVC 5
我有一些输入 JSON:
[
"id" : 1
,
"id" : 2
,
"id" : 3
]
这是由第 3 方 API 提供的
通常我会使用诸如反序列化之类的代码:
var content = await response.Content.ReadAsStringAsync();
JObject json = JObject.Parse(content);
orderList = JsonConvert.DeserializeObject<OrderList>(json.ToString());
但是我发现:
JObject json = JObject.Parse(content);
使用有问题的 JSON 崩溃。我强烈怀疑周围的“[”和“]”是原因。
我通常会添加:
items: [
更正输入的 JSON。
有没有更好的方法来反序列化它,因为这个输入 JSON 似乎不完整,尽管当我测试它时,它似乎是有效的 JSON。
也许我应该使用 JArray 而不是 JObject?
提前致谢。
【问题讨论】:
Normally I would use code such as, to deserialize: var content = await response.Content.ReadAsStringAsync(); JObject json = JObject.Parse(content); orderList = JsonConvert.DeserializeObject<OrderList>(json.ToString());
呵呵这是多余的......为什么不var content = await response.Content.ReadAsStringAsync(); orderList = JsonConvert.DeserializeObject<OrderList>(content);
您的 JSON 无效。
@Mahdis 我认为缺少逗号只是问题中的拼写错误
@Selvin,可能是的,但无论如何他都需要修复它。
要么反序列化到一个具体类的列表(最好的方法),要么改用JArray.Parse
。
【参考方案1】:
您在 JSON 中缺少逗号“,”。应该是这样的:
[
"id" : 1
,
"id" : 2
,
"id" : 3
]
你可以像这样反序列化它:
var content = await response.Content.ReadAsStringAsync();
var list = JsonConvert.DeserializeObject<List<MyClass>>(content);
其中list
是List<MyClass>
public class MyClass
public int id get; set;
【讨论】:
【参考方案2】:您有 3 个选项:
不要使用JObject.Parse
,而是使用JArray.Parse
,因为JSON 是一个数组,而不是一个对象。这不是实现您想要的最佳方式。
反序列化为List<T>
,其中T
是包含对象匹配属性的具体类。例如:
var result = JsonConvert.DeserializeObject<List<Order>>(json);
这样更好,但是……
最好的选择是首先不要将HttpClient
响应读取为string
,而是让框架为您完成工作。您应该使用ReadAsAsync<T>
扩展方法。在内部,这使用了一个流,并且比首先使用字符串更有效。比如:
List<Order> orders = await response.Content.ReadAsAsync<List<Order>>();
【讨论】:
谢谢你,但是我不认为 ReadAsAsync 是一个可用的选项。我可以看到 ReadAsStreamAsync 和 ReadAsStringAsync。我也有“使用 System.Net.Http;”想法? 使用这个:***.com/questions/10399324/… 对不起,我认为链接到文档就足够了。这个问题也很有用。以上是关于尝试使用 JSON.NET 反序列化带有 [] 字符的 JSON的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Json.Net 序列化/反序列化带有自定义键的字典?