我有一个有效的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行类型名称,计数,价格 等)。
答案 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)