2010-06-10 73 views
1

我在JavaScript中的對象,看起來像這樣如何序列化/反序列化C#類?

function MyObject(){ 
    this.name=""; 
    this.id=0; 
    this..... 
} 

然後我的字符串化對象的數組,並將其發送到一個ASP.Net Web服務。

在web服務中,我想反序列化JSON字符串,以便在C#中輕鬆處理數據。然後,我想將相同Javascript類型(相同字段名稱和所有內容)的對象數組發送回客戶端。我不明白的是如何序列化說這個類:

class MyObject{ 
    public string Name; 
    public int ID; 
} 

這樣的JSON是與上面的JavaScript對象相同。還有如何反序列化到C#MyObject類。

我該如何輕鬆做到這一點?我正在使用Netwonsoft.Json。

是否有某種方法可以將JSON字符串轉換爲對象的列表或數組?

+0

等等,這與C#有什麼關係? – 2010-06-10 16:22:44

+0

@Jesse我想一般來說這是一般的.Net,但我更喜歡C#中的答案。 – Earlz 2010-06-10 16:25:22

回答

4

與json.net可以使用JsonPropertyAttribute給你的序列化屬性的自定義名稱:

class MyObject{ 

    [JsonProperty(PropertyName = "name")] 
    public string Name; 

    [JsonProperty(PropertyName = "id")] 
    public int ID; 
} 

你可以將你的對象序列化到列表<>像這樣:

var list = new List<MyObject>(); 
var o = new MyObject(); 
list.Add(o); 
var json = JsonConvert.SerializeObject(list); 

和反序列化:

// json would look like this "[{ "name":"", "id":0 }]" 
var list = JsonConvert.DeserializeObject<List<MyObject>>(json); 
+1

考慮到它使用Netwonsoft.Json很好的答案。 – Patrick 2010-06-10 17:40:43

-1

你可以試試DataContractJsonSerializer Rick Strahl有個很好的例子。

你告訴序列化器你要序列化的類型,你可以修飾類屬性,告訴他們期望一個不同的名字。

舉個例子:

class MyObject{ 
    [DataMember(name="name")] 
    public string Name; 
    [DataMember(name="id")] 
    public int ID; 
} 

編輯:使用

using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(jsonString))) 
{ 
    ser = new DataContractJsonSerializer(typeof(MyObject)); 
    MyObject obj = ser.ReadObject(ms) as MyObject; 

    int myObjID = obj.ID; 
    string myObjName = obj.Name; 
} 
0

一件事WebMethod給你回是一個「d」包裝我與好幾個小時來解決作戰。下面是我使用Newtonsoft/JSON.NET庫的解決方案。可能有更簡單的方法來做到這一點,我很想知道。

public class JsonContainer 
{ 
    public object d { get; set; } 
} 

public T Deserialize<T>(string json) 
{ 
    JsonSerializer serializer = new JsonSerializer(); 

    JsonContainer container = (JsonContainer)serializer.Deserialize(new StringReader(json), typeof(JsonContainer)); 
    json = container.d.ToString(); 

    return (T)serializer.Deserialize(new StringReader(json), typeof(T)); 
}