将带有数组的 JSON 反序列化到 DataTable 中?

问题描述 投票:0回答:3

我知道这个问题在 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。

c# json datatable json.net json-deserialization
3个回答
4
投票

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

试试这个。它在 Visual Studio 中进行了测试

var jsonObject=JObject.Parse(json);
DataTable dt = jsonObject["artists"].ToObject<DataTable>();

2
投票

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

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

这是可行的,因为转换为数据表的对象需要是一个数组。在您的代码中,您使用了字典,而 JSON 库不知道您想用它做什么。字典可以包含许多数组和其他元素。您需要从字典中提取数组,然后将其转换为数据表。


1
投票

您的问题是

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

因此,您还可以为包含

DataTable
的根对象创建一个类。

class RootObject
{
    public DataTable artists;
}
var dt = JsonConvert.DeserializeObject<RootObject>(json).artists;

点网小提琴

© www.soinside.com 2019 - 2024. All rights reserved.