使用Json.Net将JSON解析为DataSet的问题

我一直在尝试使用json.net( https://dl.dropboxusercontent.com/u/2976553/json )解析json块,但它失败说明json对象后面有文本。 但是,如果你看看它抛出exception的位置

if (checkAdditionalContent) { if (reader.Read() && reader.TokenType != JsonToken.Comment ) throw new JsonSerializationException("Additional text found in JSON string after finishing deserializing object."); } 

我检查了TokenType,它是一个看起来不像应该生成exception的EndObject 。 我修改了代码以忽略EndOjbect ,但它似乎没有解析任何东西。

我正在使用这个..

 DataSet ds = JsonConvert.DeserializeObject(response); 

我已将json粘贴到许多在线检查器中,并且它们都将其报告为有效数据。

它不起作用的原因是因为您的JSON数据不符合将反序列化为DataSet所需的结构。 如果你看一下文档中的例子 ,数据需要像这样构建:

 { "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来执行此操作。 而且我认为这样做并不值得。

相反,我会考虑其中一个替代方案:

  1. 创建一个强类型的类层次结构并反序列化。 您可以使用json2csharp.com来帮助生成类。 (但是,请注意,json2csharp并非万无一失 – 有时您需要编辑它生成的类以使事情正常工作。)
  2. 反序列化为JObject并使用Json.Net的LINQ-to-JSON API来导航和提取所需的数据。 这是一个可能有助于此的示例 。 文档中还有许多其他示例以及StackOverflow上的示例。
  3. 反序列化为dynamic 。 这种方法可以很容易地获取您的数据,假设您已经很好地了解了它的结构,但是您失去了智能感知和编译时检查。