读取DataTable时出现意外的JSON令牌。预期的StartArray,得到了StartObject

时间:2018-01-11 19:48:35

标签: c# json json.net

我有一个有效的json(任何json字符串)字符串并尝试将其转换为Dataset但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"
    }
  ]
}
}

代码:

var table = JsonConvert.DeserializeObject<DataSet>(jsonText);

错误:

  

读取DataTable时出现意外的JSON令牌。预期的StartArray,得到了StartObject。路径&#39; root&#39;,第1行,第9位。

编辑1:

  

用户可以传递任何类型的json,我需要将其转换为DataSet   对于上面的例子&#34; root&#34; element可以包含任何其他属性   喜欢&#34; child1&#34;:&#34; val1&#34;,&#34; child2&#34;:&#34; val2&#34;等等。所以,输出   数据集将包含2个表namse root(应该有一行   属性1和2)和项目(应该有2行类型名称,计数,价格   等)。

2 个答案:

答案 0 :(得分:1)

你展示的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"
    }
  ]
}

代码:

var dataSet = JsonConvert.DeserializeObject<DataSet>(jsonText);
var table = dataSet.Tables[0];

答案 1 :(得分:0)

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

public class Wrapper
{
    [JsonProperty("root")]
    public DataSet DataSet { get; set; }
}

然后:

DataSet ds = JsonConvert.DeserializeObject<Wrapper>(json).DataSet;

Fiddle

或者,如果您不想创建课程,则可以改为反序列化为JObject,向下导航到root属性,然后将其实现为DataSet有:

DataSet ds = JObject.Parse(json)["root"].ToObject<DataSet>();

Fiddle