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

时间:2014-01-03 00:28:07

标签: c# json json.net

我一直在尝试使用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粘贴到了许多在线检查器中,他们都将其报告为有效数据。

1 个答案:

答案 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来执行此操作。我不认为这样做是值得的。

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

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