【问题标题】:Json Deserialise not consistent with apparently identical dataJson反序列化与明显相同的数据不一致
【发布时间】:2021-09-15 10:04:22
【问题描述】:

我正在将 Newtonsoft JArray 反序列化为 .NET DataTable 使用:

DataTable dt = (DataTable)JsonConvert.DeserializeObject(dataSet.ToString(), typeof(DataTable));

其中dataSet 是基本数组格式的JArray

{
  "dataset": [
    {          
      "periodDesc": "2020",     
      "cstCode": "",    
      "CIFValue": null
    },
    {
      "periodDesc": "2017",   
      "cstCode": "",   
      "CIFValue": null      
    },
    ...
  ]
}

我通过 JObject 从 API 调用中获得了这个数据集,它工作正常:

JObject jObject = GetJsonFromWebRequest(url);
JArray jArray = (JArray)jObject["dataset"];

现在做一些测试,我从GetJsonFromWebRequest 获取json 响应并将其保存到.json 文件中。

当我遇到问题时,我也对JArray 做了同样的事情;无论我是使用整个响应并首先解析为 JObject,还是使用子集 JArray,当我从文件加载这些数据时,它都不起作用!我得到了错误:

"无法将当前的 JSON 数组(例如 [1,2,3])反序列化为类型 'System.Data.DataTable' 因为该类型需要 JSON 对象(例如 {"name":"value"}) 以正确反序列化。\r\n修复此错误 将 JSON 更改为 JSON 对象(例如 {"name":"value"})或 将反序列化类型更改为数组或实现 集合接口(例如 ICollection、IList),例如 List 可以 从 JSON 数组反序列化。 JsonArrayAttribute 也可以 添加到类型以强制它从 JSON 反序列化 数组。”

我假设这可能与换行符或其他什么有关,或者我如何将其保存为 .JSON 而不是 .TXT 也许?!但我不知道发生了什么 - 在调试时查看对象,它们看起来完全相同,它成功地将 JArray 解析为 JArray - 它只是 Deserialize 位失败。

知道这里发生了什么吗?!

这是我从中加载的文件的内容减去帮助 URL - 模拟响应:

{
  "validation": {
    "status": {
      "name": "Ok",
      "value": 0,
      "category": 0,
      "description": "",
      "helpUrl": "For more reference visit"
    },
    "message": null,
    "count": {
      "value": 5,
      "started": "2021-09-15T09:14:05.277794+02:00",
      "finished": "2021-09-15T09:14:07.8662927+02:00",
      "durationSeconds": 2.5884986999999997
    },
    "datasetTimer": {
      "started": "2021-09-15T09:14:05.277794+02:00",
      "finished": "2021-09-15T09:14:15.2487336+02:00",
      "durationSeconds": 9.9709396
    }
  },
  "dataset": [
    {
      "periodDesc": "2017",
      "cstCode": "",
      "CIFValue": null
    },
    {
      "periodDesc": "2018",
      "cstCode": "",
      "CIFValue": null
    },
    {
      "periodDesc": "2019",
      "cstCode": "",
      "CIFValue": null
    },
    {
      "periodDesc": "2020",
      "cstCode": "",
      "CIFValue": null
    }
  ]
}

【问题讨论】:

  • “或者我是如何将它保存为 .JSON 而不是 .TXT 的?!” - 当文件的内容到达序列化程序时,它没有不管 JSON 的来源是什么,更不用说文件扩展名了。
  • 请显示文件内容以及您是如何阅读和反序列化的。
  • 你检查过字符编码吗?例如 - ASCII vs UTF8 vs UTF16
  • @Llama 我已添加文件,该文件是源响应的复制/粘贴。
  • Example 1(基于您的初始代码和 JSON)。 Example 2(基于您的文件 JSON)。目前我的结论是,除了你在问题中向我们展示的内容之外,你一定做错了什么。

标签: c# json json.net


【解决方案1】:

好的,这与NewtonSoft 版本不兼容有关。我需要在我的NUnit 测试项目中显式安装NewtonSoft 3.x 并且它工作正常。

虽然主 API 项目没有此包依赖项/引用,但它确实在 startup 中有一行:

services.AddControllers().AddNewtonsoftJson();

哪个明显做同样的事情?!

【讨论】:

    猜你喜欢
    • 2016-07-04
    • 1970-01-01
    • 2011-06-28
    • 2014-01-22
    • 2015-01-04
    • 1970-01-01
    • 2014-11-02
    • 2017-08-31
    • 1970-01-01
    相关资源
    最近更新 更多