我一直在尝试使用json.net(https://dl.dropboxusercontent.com/u/2976553/json)解析一个json块,但是它无法声明json对象之后有文本。但是,如果你看看它抛出异常的位置
if (checkAdditionalContent)
{
if (reader.Read() && reader.TokenType != JsonToken.Comment )
throw new JsonSerializationException("Additional text found in JSON string after finishing deserializing object.");
}
我检查了TokenType,它是EndObject
,似乎不应该生成异常。我修改了代码以忽略EndOjbect
,但它似乎没有解析任何东西。
我正在使用它..
DataSet ds = JsonConvert.DeserializeObject<DataSet>(response);
我已经将json粘贴到了许多在线检查器中,他们都将其报告为有效数据。
答案 0 :(得分:2)
它不起作用的原因是因为您的JSON数据不符合将反序列化为DataSet所需的结构。如果你看一下example from the documentation,那么数据的结构必须如下:
{
"table1" :
[
{
"column1" : "value1",
"column2" : "value2"
},
{
"column1" : "value3",
"column2" : "value4"
}
],
"table2" :
[
{
"column1" : "value1",
"column2" : "value2"
},
{
"column1" : "value3",
"column2" : "value4"
}
]
}
换句话说,外部对象包含表示表的属性。属性名称对应于表的名称,值是所有对象的数组,其中每个对象表示表中的一行。对象的属性对应于列名称,它们的值是行数据。行数据值必须是简单类型,如string,int,bool等。(如果您使用的是Json.Net 6.0或更高版本,也支持简单类型和嵌套数据表的数组。)
您的JSON数据比这更复杂,并且是深层嵌套的。您将无法让Json.Net将其反序列化为DataSet,除非您编写自己的自定义JsonConverter来执行此操作。我不认为这样做是值得的。
相反,我会考虑其中一个替代方案:
JObject
并使用Json.Net的LINQ-to-JSON API来导航和提取所需的数据。以下an example可能对此有所帮助。文档中还有许多其他示例以及StackOverflow。dynamic
。这种方法可以很容易地获取您的数据,假设您已经很好地了解了它的结构,但是您失去了智能感知和编译时检查。