JavaScriptSerializer:无法反序列化包含HashSet字段的对象

时间:2013-08-22 13:23:52

标签: c# json

我正在尝试使用JavaScriptSerializer从JSON字符串反序列化以下类的实例:

public class Filter
{
    public HashSet<int> DataSources { get; set;  }
}

以下是我要尝试的代码:

        Filter f = new Filter();

        f.DataSources = new HashSet<int>(){1,2};

        string json = (new JavaScriptSerializer()).Serialize(f);         

        var g= (new JavaScriptSerializer()).Deserialize<Filter>(json);

错误输出以下消息:

  

类型为'System.Collections.Generic.List 1[System.Int32]' cannot be converted to type 'System.Collections.Generic.HashSet的对象1 [System.Int32]'。

显然,序列化程序无法区分列表和JSON表示集。解决方案是什么?

注意:由于工作中的限制,我宁愿避免使用外部库。

2 个答案:

答案 0 :(得分:4)

  

这是什么解决方案?

使用Json.Net。这段代码有用......

Filter f = new Filter();

f.DataSources = new HashSet<int>() { 1, 2 };

string json = JsonConvert.SerializeObject(f);

var g = JsonConvert.DeserializeObject<Filter>(json);

修改

DataContractJsonSerializer似乎也有效......

DataContractJsonSerializer dcjs = new DataContractJsonSerializer(typeof(Filter));
var g2 = dcjs.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes(json))) as Filter;

答案 1 :(得分:0)

这不是我的简单解决方案,但是可以用。

var dataList = new JavaScriptSerializer().Deserialize<List<int>>(returnData);
var data = new HashSet<int>(dataList);