我知道这个问题在 StackOverflow 中很受欢迎,但我似乎找不到合适的解决方案...我几乎查看了与此相关的每个问题,尝试了几乎所有方法,但没有一个有效。 ..
看起来,我的问题是我的 JSON 中有数组,而 JSON.Net 反序列化器根本不喜欢这样。所以,我最后的选择是自己发布问题。
这是我的 JSON:
{"artists":
[
{"Name":"artsit",
"URL":"www.example.com",
"Desc":"very nice artist",
"Rating":5,
"NSFW":false,
"Tags":["good","epic"],
"fav":true
},
{"Name":"another artist",
"URL":"www.test.net",
"Desc":"super cool",
"Rating":3,
"NSFW":true,
"Tags":["digital","commissions"],
"fav":false
}
]
}
这是我的 C# 代码:
using StreamReader r = new StreamReader("C:\\path\\to\\json\\file.json");
string json = r.ReadToEnd();
DataTable dt = JsonConvert.DeserializeObject<DataTable>(json);
但是当我尝试运行它时,出现以下异常:
Newtonsoft.Json.JsonSerializationException: 'Unexpected JSON token when reading DataTable. Expected StartArray, got StartObject. Path '', line 1, position 1.'
在这个特定问题中,有一个答案试图解决我遇到的同样问题,但不幸的是我无法使其工作。
相信我,我已经尝试了所有适合这个问题的方法,但仍然无法解决它,请帮忙。我不会包含用于此问题的其他解决方案的代码,例如将其反序列化为自定义类,因为这会使一切变得更加混乱。我在 WinForms 项目中使用 Visual Studio 2022、.NET 6.0。
您遇到反序列化错误“...预期 StartArray,获得 StartObject。”所以你不能将整个对象反序列化到DataTable,你只需要一个数组部分。数组部分从“艺术家”开始。因此,在解析整个对象后,您必须仅反序列化“艺术家”部分。
试试这个。它在 Visual Studio 中进行了测试
var jsonObject=JObject.Parse(json);
DataTable dt = jsonObject["artists"].ToObject<DataTable>();
您是否尝试从外部字典中提取列表?
dynamic jsonDict = JsonConvert.DeserializeObject(jsonString);
var jarrayString = JsonConvert.SerializeObject(jsonDict["artists"]);
var dt = JsonConvert.DeserializeObject<DataTable>(jarrayString);
这是可行的,因为转换为数据表的对象需要是一个数组。在您的代码中,您使用了字典,而 JSON 库不知道您想用它做什么。字典可以包含许多数组和其他元素。您需要从字典中提取数组,然后将其转换为数据表。
您的问题是
DataTable
实际上是根对象的属性,名称为 artists
因此,您还可以为包含
DataTable
的根对象创建一个类。
class RootObject
{
public DataTable artists;
}
var dt = JsonConvert.DeserializeObject<RootObject>(json).artists;