我有一个有效的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"
}
]
}
}
法典:
var table = JsonConvert.DeserializeObject<DataSet>(jsonText);
错误:
读取数据表时出现意外的 JSON 令牌。预期的 StartArray,得到了 StartObject。路径"根",第 1 行,位置 9。
编辑 1:
用户可以传递任何类型的 json,我需要将其转换为数据集 对于上面的示例,"root"元素可以包含任何其他属性 如"child1":"val1"、"child2":"val2"等。所以,输出 数据集将包含 2 个表 namse 根(应有一行 属性 1 和 2(和项目(应有 2 行类型名称、计数、价格 等(。
它不起作用,因为表示DataSet
的 JSON 对象不在 JSON 的根级别。 在您的 JSON 中,它位于一个名为 root
的属性内,该属性位于另一个包装器对象内。 因此,在反序列化时需要考虑该外部对象。 您可以定义一个包装类并反序列化为:
public class Wrapper
{
[JsonProperty("root")]
public DataSet DataSet { get; set; }
}
然后:
DataSet ds = JsonConvert.DeserializeObject<Wrapper>(json).DataSet;
(小提琴(
或者,如果您不想创建类,则可以反序列化为JObject
,向下导航到 root
属性,然后从那里将其具体化为DataSet
:
DataSet ds = JObject.Parse(json)["root"].ToObject<DataSet>();
(小提琴(
您显示的 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];
只需在字符串化对象时添加[]
:
JSON.stringify([this.YourModel])