【问题标题】:How to parse a simple JSON string to a DataSet with Json.Net如何使用 Json.Net 将简单的 JSON 字符串解析为 DataSet
【发布时间】:2013-07-18 02:49:32
【问题描述】:

我已经尝试了所有我能想到的尝试使用 JSON.net 库解析这个 JSON 字符串的方法,但我不断收到错误消息,提示“字符串反序列化后的附加文本”。有人对可能出现的问题有任何想法吗?

这是我拥有的 JSON 字符串:

{"w_vendor":["914115361","914115361","914115361","914115361","914115361","914115361","914115361","914115361","914115361","914115361","914115361","914115361","914115361","914115361","914115361","914115361","914115361","914115361","914115361","914115361","914115361","914115361","914115361","914115361","914115361","914115361","914115361","914115361","914115361","914115361","914115361","914115361","914115361","914115361","914115361","914115361"]}

这是我用来解析它的代码:

var pdfValue = Request["pdfValue"];
string OutputCacheLocation = JsonConvert.SerializeObject(pdfValue);
DataSet dataset = JsonConvert.DeserializeObject<DataSet>(pdfValue);

DataTable datatable = dataset.Tables["table1"];

Response.Write(datatable.Rows.Count);

有人看到错误所指的附加文本吗?我看不到它,而且 JSON 不会解析。我准备放弃并自己手动解析它。

【问题讨论】:

    标签: json c#-4.0 json.net


    【解决方案1】:

    您是否考虑过为您的数据创建一个自定义类并反序列化为,而不是反序列化为 DataSet?使用起来可能会更简单一些。

    例如,如果你这样定义一个类:

    class Data
    {
        [JsonProperty(PropertyName="w_vendor")]
        public List<string> Values { get; set; }
    }
    

    然后你可以像这样反序列化:

    string json = @"{""w_vendor"":[""914115361"",""914115361"",""914115361"",""914115361"",""914115361"",""914115361"",""914115361"",""914115361"",""914115361"",""914115361"",""914115361"",""914115361"",""914115361"",""914115361"",""914115361"",""914115361"",""914115361"",""914115361"",""914115361"",""914115361"",""914115361"",""914115361"",""914115361"",""914115361"",""914115361"",""914115361"",""914115361"",""914115361"",""914115361"",""914115361"",""914115361"",""914115361"",""914115361"",""914115361"",""914115361"",""914115361""]}";
    
    var data = JsonConvert.DeserializeObject<Data>(json);
    
    Response.Write(data.Values.Count);
    

    编辑

    它没有按照您的方式工作的原因是因为您的数据不符合反序列化为DataSet 所需的结构。如果你看一下example from the documentation,数据的结构应该是这样的:

    {
        "table1" : 
        [
            {
                "column1" : "value1",
                "column2" : "value2"
            },
            {
                "column1" : "value3",
                "column2" : "value4"
            }            
        ],
        "table2" : 
        [
            {
                "column1" : "value1",
                "column2" : "value2"
            },
            {
                "column1" : "value3",
                "column2" : "value4"
            }            
        ]
    }
    

    具体来说,外部对象包含表示表格的属性。属性名称对应于表的名称,值是 objects 的数组,其中每个对象代表表中的一行。对象的属性对应列名,其值为行数据。

    在您的数据中,外部对象包含一个属性,其值是一个简单字符串数组,而不是对象。所以这不能变成表格,因为 JSON.NET 无法确定列名。此外,您的数据表的名称应该是 w_vendor,而不是 table1

    【讨论】:

    • 那行得通,谢谢你,但我不明白我做错了什么。感谢您的回复!
    • 我编辑了我的答案,解释了为什么它不能按照你的方式工作。
    • 完美的感觉 Brian 感谢您的解释。我现在完全明白了!你是男人!
    猜你喜欢
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多