JSON.NET" System.OutOfMemoryException"反序列化为DataSet时

时间:2014-06-11 02:06:11

标签: c# json json.net

C#和JSON非常新。我一直在努力解决这个问题大约一天,但无法理解。

JSONLint表示两个JSON字符串都有效。

尝试反序列化以下

{"items":[{"id":"1122267","quantity":"1","bundle":"1"}],"seconds_ago":"1"}

抛出异常

  

发生了类型为“System.OutOfMemoryException”的未处理异常   在Newtonsoft.Json.dll

如果我尝试

{"items":[{"id":"1122267","quantity":"1","bundle":"1"}]} 

它有效。

我正在从文本框中读取JSON字符串,然后使用以下

进行反序列化
string json = textBox1.Text;
DataSet dataSet = JsonConvert.DeserializeObject<DataSet>(json);

2 个答案:

答案 0 :(得分:3)

我对DataSet并不熟悉,但在玩了一下之后,我想我找到了原因。根据文件:

  

DataSet包含一个集合的DataTable对象

由于DataSet是对象的集合,因此您可以仅将集合(数组)反序列化到其中。所以,

{"items":[{"id":"1122267","quantity":"1","bundle":"1"}],"seconds_ago":"1"}

不起作用,因为它包含一个集合(items)和一个属性(seconds_ago)。另一方面,

{"items":[{"id":"1122267","quantity":"1","bundle":"1"}]} 

有效,因为它只包含一个集合。

因此,如果你真的想将你的json字符串反序列化为DataSet,你应该这样做:

{
    "objects": [
        {
            "items":[{"id":"1122267","quantity":"1","bundle":"1"}],
            "seconds_ago":"1"
        }
    ]
} 

你应该考虑deserializing into a C# object,我认为这样做不那么复杂,也不容易处理:

public class RootObject
{
    public List<Item> items { get; set; }
    public string seconds_ago { get; set; }
}

public class Item
{
    public string id { get; set; }
    public string quantity { get; set; }
    public string bundle { get; set; }
}

RootObject deserializedObject = JsonConvert.DeserializeObject<RootObject>(json);

答案 1 :(得分:-1)

DataSet类没有属性seconds_agoitems。所以

DataSet dataSet = JsonConvert.DeserializeObject<DataSet>(json);

永远不会有效,因为您无法将特定的json字符串转换为DataSet