尝试使用 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&lt;OrderList&gt;(json.ToString()); 呵呵这是多余的......为什么不var content = await response.Content.ReadAsStringAsync(); orderList = JsonConvert.DeserializeObject&lt;OrderList&gt;(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);

其中listList&lt;MyClass&gt;

public class MyClass

    public int id  get; set; 

【讨论】:

【参考方案2】:

您有 3 个选项:

    不要使用JObject.Parse,而是使用JArray.Parse,因为JSON 是一个数组,而不是一个对象。这不是实现您想要的最佳方式。

    反序列化为List&lt;T&gt;,其中T 是包含对象匹配属性的具体类。例如:

    var result = JsonConvert.DeserializeObject<List<Order>>(json);
    

    这样更好,但是……

    最好的选择是首先不要将HttpClient 响应读取为string,而是让框架为您完成工作。您应该使用ReadAsAsync&lt;T&gt; 扩展方法。在内部,这使用了一个流,并且比首先使用字符串更有效。比如:

    List<Order> orders = await response.Content.ReadAsAsync<List<Order>>();
    

【讨论】:

谢谢你,但是我不认为 ReadAsAsync 是一个可用的选项。我可以看到 ReadAsStreamAsync 和 ReadAsStringAsync。我也有“使用 System.Net.Http;”想法? 使用这个:***.com/questions/10399324/… 对不起,我认为链接到文档就足够了。这个问题也很有用。

以上是关于尝试使用 JSON.NET 反序列化带有 [] 字符的 JSON的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Json.Net 序列化/反序列化带有自定义键的字典?

使用 JSON.NET 反序列化 IOrderedEnumerable<T>

使用 Json.net 反序列化 JSON 对象数组

使用 Json.NET 转换器反序列化属性

如何使用 Json.NET 反序列化高精度十进制值?

Json.Net以索引为名称反序列化JSON对象[重复]