Json Deserializer将对象读取到数组

时间:2012-07-13 18:39:49

标签: c# json silverlight parsing deserialization

我正在编写一个反序列化器回调方法来解析C#silverlight中的一些Json响应。

但问题是响应是由一堆对象构成的,而不是以数组形式构建的。

具体来说,通常当我们想要从json解析一些东西时,如果这是一个对象列表,它在某些Json可视化器中会如下所示:

Json Array

我们可以做类似的事情:

DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(ObjType[]));
ObjType[] response = (ObjType[])jsonSerializer.ReadObject(stream);

但是现在我有了Json文件,结构看起来像这样:

enter image description here

在这种情况下,我不认为我可以将它解析为数组,因为对象是个体而不是数组结构。

Json文件的示例是:

[
   {
      "Name":"Mike",
      "Gender":"male",
   },
   {
      "Name":"Lucy",
      "Gender":"Female ",
   },
   {
      "Name":"Jack",
      "Gender":"Male",
   }
]

所以我想知道是否有任何方法可以将这种Json文件解析为已定义对象的数组。

3 个答案:

答案 0 :(得分:3)

这对我有用

string json = @"[
    {
        ""Name"":""Mike"",
        ""Gender"":""male""
    },
    {
        ""Name"":""Lucy"",
        ""Gender"":""Female ""
    },
    {
        ""Name"":""Jack"",
        ""Gender"":""Male""
    }
]";
MemoryStream stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(json));

DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(ObjType[]));
ObjType[] response = (ObjType[])jsonSerializer.ReadObject(stream);

-

[DataContract]
public class ObjType
{
    [DataMember]
    public string Name;
    [DataMember]
    public string Gender;
}

答案 1 :(得分:1)

[System.Runtime.Serialization.DataContractAttribute()]
public partial class RootClass
{

    [System.Runtime.Serialization.DataMemberAttribute()]
    public string Name;

    [System.Runtime.Serialization.DataMemberAttribute()]
    public string Gender;
}

    static void Main(string[] args)
    {
       var serializer = new DataContractJsonSerializer(typeof(RootClass[]));
        serializer.ReadObject(/*Input stream w/ JSON*/);

    }

答案 2 :(得分:0)

public static T JSONDeserialize<T>(string json)
        {
            T obj = default(T);
            using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))
            {
                obj = Activator.CreateInstance<T>();
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
                obj = (T)serializer.ReadObject(ms);
                ms.Close();
            }`enter code here`
            return obj;
        }