C# 使用DataContractJsonSerializer反序列化简单JSON数组
我相信这个问题已经被问了一遍又一遍,但由于某种原因,我仍然无法让它发挥作用 我想反序列化一个包含单个成员的JSON对象;字符串数组:C# 使用DataContractJsonSerializer反序列化简单JSON数组,c#,.net,json,C#,.net,Json,我相信这个问题已经被问了一遍又一遍,但由于某种原因,我仍然无法让它发挥作用 我想反序列化一个包含单个成员的JSON对象;字符串数组: {"results" : ["a", "b"]} 这是我试图反序列化到的类: public class Whatever { [DataMember(Name = "results")] public string[] Results { get; protected set; } } 这是反序列化方法: private static T De
{"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);
}
}
private static T反序列化(字符串json)
{
var instance=Activator.CreateInstance();
使用(var ms=newmemoryStream(Encoding.Unicode.GetBytes(json)))
{
var serializer=newdatacontractjsonserializer(instance.GetType());
return(T)serializer.ReadObject(ms);
}
}
类似于反序列化(“{\'results\”:[\'A\”,\'b\“]}”)的调用
返回任何内容的初始化实例
,但结果
数组保持为null
Whatever
的结构有什么问题吗?啊,在发布了这篇文章之后,我意识到我缺少了Whatever
上的DataContract
属性装饰:
[DataContract]
public class Whatever {
[DataMember(Name = "results")]
public string[] Results { get; protected set; }
}
现在它工作得很好。我知道,这个职位是相当禁止的;但是: 如果您获得了要绑定到数据类的jsonarray信息字符串,还可以直接返回类对象列表;i、 e:
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
您不需要
var instance=Activator.CreateInstance()代码>使用typeof(T)
谢谢。映射数据成员的名称(区分大小写)也很重要。您已经这样做了,但是我想强调一下,如果有人试图使用DataContract和DataMember,但忘记了Name属性(就像我第一次做的那样)。对于列表,您的示例与您发布的示例不同。
[DataContract]
class SomeDataClass
{
[DataMember]
public int ID { get; set; }
}