【问题标题】:Trying to deserialize JSON with surrounding [] characters usig JSON.NET尝试使用 JSON.NET 反序列化带有 [] 字符的 JSON
【发布时间】: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

标签: c# json.net


【解决方案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 个选项:

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

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

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

      这样更好,但是……

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

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

    【讨论】:

    • 谢谢你,但是我不认为 ReadAsAsync 是一个可用的选项。我可以看到 ReadAsStreamAsync 和 ReadAsStringAsync。我也有“使用 System.Net.Http;”想法?
    • 对不起,我认为链接到文档就足够了。这个问题也很有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多