2010-06-10 54 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)); 
}