用数组反序列化 JSON 到 DataTable?

Deserialize JSON with an array into DataTable?

我知道这个问题在 Whosebug 中很受欢迎,但我似乎找不到合适的解决方案...我已经查看了几乎所有与此相关的问题,尝试了几乎所有方法,但是 none 他们工作了...

看来,我的问题是我的 JSON 中有数组,而 JSON.Net 反序列化器根本不喜欢这样。所以,我最后的选择是 post 自己提问。

这是我的 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.'

this particular question 中,有一个答案试图解决我遇到的同样问题,但不幸的是我没能解决它。

相信我,我已经尝试了所有看起来适合这个问题的方法,但我仍然无法解决,请帮助。我不会包括我用于此问题的其他解决方案的代码,例如将其反序列化为自定义 class,因为这会使一切变得更加混乱。我在 WinForms 项目中使用 Visual Studio 2022、.NET 6.0。

您是否尝试从外部字典中提取列表?

dynamic jsonDict = JsonConvert.DeserializeObject(jsonString);
var jarrayString = JsonConvert.SerializeObject(jsonDict["artists"]);
var dt = JsonConvert.DeserializeObject<DataTable>(jarrayString);

您遇到反序列化错误“...需要 StartArray,得到 StartObject。”所以你不能反序列化到 DataTable 整个对象,你只需要一个数组部分。数组部分从“艺术家”开始。因此,在解析整个对象后,您只需反序列化“艺术家”部分。

试试这个。它在 Visual Studio

中进行了测试
var jsonObject=JObject.Parse(json);
DataTable dt = jsonObject["artists"].ToObject<DataTable>();

您的问题是 DataTable 实际上是根对象的 属性,名称为 artists

因此您还可以为包含 DataTable.

的根对象创建一个 class
class RootObject
{
    public DataTable artists;
}
var dt = JsonConvert.DeserializeObject<RootObject>(json).artists;

dotnetfiddle