Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用DataContractJsonSerializer反序列化简单JSON数组_C#_.net_Json - Fatal编程技术网

C# 使用DataContractJsonSerializer反序列化简单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

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

我想反序列化一个包含单个成员的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);
    }
}
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; }        
}