【问题标题】:Issue using Json.Net to parse JSON to a DataSet使用 Json.Net 将 JSON 解析为数据集的问题
【发布时间】:2014-01-20 13:55:59
【问题描述】:

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

【问题讨论】:

标签: c# json json.net


【解决方案1】:

它不起作用的原因是您的 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 数据比这复杂得多,而且嵌套很深。除非您编写自己的自定义 JsonConverter 来执行此操作,否则您将无法让 Json.Net 将其反序列化为 DataSet。而且我认为这样做不值得。

相反,我会考虑以下其他选择之一:

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

【讨论】:

  • 可以用json.net反序列化成动态吗?
  • 是的。 dynamic foo = JsonConvert.DeserializeObject&lt;dynamic&gt;(json)
  • 我最终做了类似Dictionary&lt;string, object&gt; dict = JsonConvert.DeserializeObject&lt;Dictionary&lt;string, object&gt;&gt;(response);Newtonsoft.Json.Linq.JArray results = (Newtonsoft.Json.Linq.JArray)dict["results"]; 这样的命令,然后像rr.mpn = item["mpn"].ToString(); 这样的命令起作用了(经过大量试验和错误才能弄清楚)
猜你喜欢
  • 1970-01-01
  • 2015-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
  • 1970-01-01
  • 2013-03-21
  • 2010-09-28
相关资源
最近更新 更多