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

And*_*ech 14 .net c# json

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

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

{"results" : ["a", "b"]}
Run Code Online (Sandbox Code Playgroud)

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

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

这是Deserialize方法:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

类似的调用Deserialize<Whatever>("{\"results\" : [\"a\", \"b\"]}")返回一个初始化的实例,WhateverResults数组仍在停留null.

结构有问题Whatever吗?

And*_*ech 13

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

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

现在它工作正常.

  • 谢谢.将数据成员的名称映射为区分大小写也很重要.你已经这样做了,但是我想强调一下,如果有人试图使用DataContract和DataMember,但忘记了Name属性(就像我第一次做的那样). (7认同)

mer*_*edo 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
Run Code Online (Sandbox Code Playgroud)

与dataclass SomeDataClass.cs:

[DataContract]
class SomeDataClass
{
    [DataMember]
    public int ID { get; set; }        
}
Run Code Online (Sandbox Code Playgroud)