使用DataContractJsonSerializer反序列化一个简单的JSON数组

时间:2011-11-20 20:07:35

标签: c# .net json

我确定这个问题一再被问到,但由于某种原因,我仍然无法让这个问题起作用。

我想反序列化包含单个成员的JSON对象;一个字符串数组:

{"results" : ["a", "b"]}

这是我正在尝试反序列化的类:

public class Whatever {
    [DataMember(Name = "results")]
    public string[] Results { get; protected set; }
}

这就是反序列化方法:

private static T Deserialize<T>(string json)
{
    var instance = Activator.CreateInstance<T>();
    using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
    {
        var serializer = new DataContractJsonSerializer(instance.GetType());
        return (T)serializer.ReadObject(ms);
    }
}

Deserialize<Whatever>("{\"results\" : [\"a\", \"b\"]}")之类的调用正在返回Whatever的初始化实例,但Results数组正在停留null

Whatever的结构是否有问题?

2 个答案:

答案 0 :(得分:13)

啊,发布后我意识到我错过了DataContract上的Whatever属性修饰:

[DataContract]
public class Whatever {
    [DataMember(Name = "results")]
    public string[] Results { get; protected set; }
}

现在工作正常。

答案 1 :(得分:9)

我知道,这个帖子已被禁止;但: 如果你有一个jsonarray信息字符串绑定到一个数据类,也可以直接返回一个类对象列表;即:

List<SomeDataClass> filesToMove = new List<SomeDataClass>();

public T deserializeJSON<T>(string json)
{
    var instance = typeof(T);
    var lst = new List<SomeDataClass>();

     using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
     {
         var deserializer = new DataContractJsonSerializer(instance);
         return (T)deserializer.ReadObject(ms);
     }
}

someJsonArrayString = "[{\"ID\":7},{\"ID\":16}]";
filesToMove = deserializeJSON<List<SomeDataClass>>(someJsonArrayString);
Console.WriteLine(filesToMove[1].ID); // returns 16

使用数据类SomeDataClass.cs:

[DataContract]
class SomeDataClass
{
    [DataMember]
    public int ID { get; set; }        
}