将JSON到C#对象序列化为对象的ArrayList

时间:2016-08-25 02:29:49

标签: c# json datacontractserializer

我有以下JSON:

  {
    "id": "3cf5373c-9181-4639-89f0-bb64b387f961",
    "display": "Data 1",
    "country": "AU"
  }

我知道如何构建类来序列化它:

[DataContract]
public class myJSONClass
{

    [DataMember(Name = "id")]
    public string Id { get; set; }

    [DataMember(Name = "display")]
    public string Display { get; set; }

    [DataMember(Name = "country")]
    public string Country { get; set; }
}

我使用以下序列化:

        var url = "http://myJSONAPI/";

        var syncClient = new WebClient();
        var content = syncClient.DownloadString(url);

        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(myJSONClass));
        using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(content)))
        {
            var jsonData = (myJSONClass)serializer.ReadObject(ms);
        }

但是,如果我的JSON如下所示,我将如何定义我的课程?

[
  {
    "id": "3cf5373c-9181-4639-89f0-bb64b387f961",
    "display": "My Data 1",
    "country": "AU"
  },
  {
    "id": "8886d2c8-0fd5-49ff-a3e1-7cef9e654514",
    "display": "no test",
    "country": null
  }
]

如何宣布我的课程?

我该如何序列化?我不能使用JSON.net,因为我不能使用更新的.Net框架。

2 个答案:

答案 0 :(得分:2)

[] - 这是阵列。因此,在反序列化之后,您应该获得类的单个数组对象(myJSONClass)

myJSONClass[] deserializedData=deserialize(jsonData);

因此,如果你想得到一个反序列化的对象数组,你应该只序列化一个对象而不是一个数组(你的类的几个对象)

但是你在例子中做了一些奇怪的事情,因为你下载了字符串并尝试序列化它。但是您收到了序列化数据(字符串是序列化的。可以通过反序列化json(或xml)字符串来创建对象。)

因此,如果您实际上在数组中收到了2个对象(如在上一个JSON示例中),那么您的代码应该更像这样:

    var url = "http://myJSONAPI/";
    var syncClient = new WebClient();
    var content = syncClient.DownloadString(url);

    DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(myJSONClass[]));
    using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(content)))
    {
        myJSONClass[] jsonObject = (myJSONClass[])serializer.ReadObject(ms);
    }

为了更好地理解,我重命名了一些变量。现在你反序列化你的类的数组。

我也找到了这个帖子:Deserialization of array with DataContractJsonSerializer with Windows Store App

但我自己的建议是看看NewtonsoftJSON。真的很甜蜜 http://www.newtonsoft.com/json/help/html/deserializeobject.htm 那么你可以用一条线来实现一切:

myJSONClass[] res = JsonConvert.DeserializeObject<myJSONClass[]>(json_string);

答案 1 :(得分:1)

你可以做一些:

// Use for JavaScriptSerializer
using System.Web.Script.Serialization; 
JavaScriptSerializer serializer = new JavaScriptSerializer();
List<myJSONClass> myList = serializer.Deserialize<List<myJSONClass>>(content);

// Use for JsonConvert
using Newtonsoft.Json;
List<myJSONClass> myList = Newtonsoft.Json.JsonConvert.DeserializeObject<List<myJSONClass>>(content);

希望这有帮助!