读取 DataTable 时出现意外的 JSON 标记。预期的 StartArray,得到 StartObject

A_S*_*_Sk 4 c# json json.net

我有一个有效的 json(任何 json 字符串)字符串并尝试将其转换为数据集,但 Newtonsoft.Json 未能这样做。

JSON文本:

  {"root": {
  "Item": [
    {
      "Name": "Super Mario Bros",
      "Count": "14",
      "Price": "29,99",
      "Comment": "-No Comment-",
      "Artist": "N/A",
      "Publisher": "Nintendo",
      "Genre": "Video Games",
      "Year": "1985",
      "ProductID": "001"
    },
    {
      "Name": "The Legend of Zelda",
      "Count": "12",
      "Price": "34,99",
      "Comment": "-No Comment-",
      "Artist": "N/A",
      "Publisher": "Nintendo",
      "Genre": "Video Games",
      "Year": "1986",
      "ProductID": "002"
    }
  ]
}
}
Run Code Online (Sandbox Code Playgroud)

代码:

var table = JsonConvert.DeserializeObject<DataSet>(jsonText);
Run Code Online (Sandbox Code Playgroud)

错误:

读取 DataTable 时出现意外的 JSON 标记。预期的 StartArray,得到 StartObject。路径“根”,第 1 行,位置 9。

编辑1:

用户可以传递任何类型的 json,我需要将其转换为 DataSet 上面的示例“root”元素可以包含任何其他属性,如“child1”:“val1”、“child2”:“val2”等等。因此,输出数据集将包含 2 个表 namse root(应该有一行属性 1 和 2)和项目(应该有 2 行类型名称、计数、价格等)。

Bri*_*ers 5

它不起作用,因为表示 的 JSON 对象DataSet不在 JSON 的根级别。在您的 JSON 中,它位于名为的属性内,该属性root位于另一个包装器对象内。因此,您在反序列化时需要考虑该外部对象。您可以定义一个包装类并将其反序列化为:

public class Wrapper
{
    [JsonProperty("root")]
    public DataSet DataSet { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后:

DataSet ds = JsonConvert.DeserializeObject<Wrapper>(json).DataSet;
Run Code Online (Sandbox Code Playgroud)

小提琴

或者,如果您不想创建一个类,您可以反序列化为 a JObject,向下导航到该root属性,然后DataSet从那里将其具体化为 a :

DataSet ds = JObject.Parse(json)["root"].ToObject<DataSet>();
Run Code Online (Sandbox Code Playgroud)

小提琴


Ale*_*rov 3

您显示的 Json 无效。

它应该看起来像这样,加载到DataSet

{
  "Item": [
    {
      "Name": "Super Mario Bros",
      "Count": "14",
      "Price": "29,99",
      "Comment": "-No Comment-",
      "Artist": "N/A",
      "Publisher": "Nintendo",
      "Genre": "Video Games",
      "Year": "1985",
      "ProductID": "001"
    },
    {
      "Name": "The Legend of Zelda",
      "Count": "12",
      "Price": "34,99",
      "Comment": "-No Comment-",
      "Artist": "N/A",
      "Publisher": "Nintendo",
      "Genre": "Video Games",
      "Year": "1986",
      "ProductID": "002"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

代码:

var dataSet = JsonConvert.DeserializeObject<DataSet>(jsonText);
var table = dataSet.Tables[0];
Run Code Online (Sandbox Code Playgroud)