【问题标题】:Deserializing a simple JSON array with DataContractJsonSerializer使用 DataContractJsonSerializer 反序列化一个简单的 JSON 数组
【发布时间】:2011-11-20 20:07:35
【问题描述】:

我确信这个问题已经被问了一遍又一遍,但由于某种原因,我仍然无法让它发挥作用。

我想反序列化一个包含单个成员的 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&lt;Whatever&gt;("{\"results\" : [\"a\", \"b\"]}") 这样的调用返回Whatever 的初始化实例,但Results 数组仍保留null

Whatever的结构有问题吗?

【问题讨论】:

  • 你不需要var instance = Activator.CreateInstance&lt;T&gt;();使用typeof(T)

标签: c# .net json


【解决方案1】:

啊,发布后我意识到我缺少Whatever 上的DataContract 属性装饰:

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

现在可以正常使用了。

【讨论】:

  • 谢谢。区分大小写的映射数据成员的名称也很重要。您已经这样做了,但是我想强调这一点,以防有人尝试使用 DataContract 和 DataMember,但忘记了 Name 属性(就像我第一次所做的那样)。
【解决方案2】:

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

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; }        
}

【讨论】:

  • 列表有什么问题,您的示例不像您发布的那样工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多