【发布时间】: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 我已添加文件,该文件是源响应的复制/粘贴。