2016-08-25 92 views
0

的ArrayList中,我有以下JSON:序列化JSON到C#对象为对象

{ 
    "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

[] - 它是数组。所以,反序列化后,你应该把你的类的单个阵列对象(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); 
+0

非常感谢@dmitry,它完美的工作。此外,我还想使用NewtonsoftJSON,但它是我们的旧系统之一,无法升级到更新的.Net。 ;( –

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

希望这有助于!

+0

C#单行工作对我来说就像是一个梦想谢谢 – Wazzie