【问题标题】:How to serialize/deserialize a C# class?如何序列化/反序列化 C# 类?
【发布时间】:2010-06-10 16:16:47
【问题描述】:

我在 Javascript 中有一个看起来像这样的对象

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 字符串转换为对象的列表或数组?

【问题讨论】:

  • 等等,这和C#有什么关系?
  • @Jesse 我想一般来说这与.Net有关,但我更喜欢 C# 中的答案。

标签: c# .net json json.net


【解决方案1】:

使用 json.net,您可以使用 JsonPropertyAttribute 为您的序列化属性指定一个自定义名称:

class MyObject{

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

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

然后您可以将对象序列化为 List,如下所示:

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

【讨论】:

  • 很好的答案,考虑到它使用 Netwonsoft.Json。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    你可以试试 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-10-12
      • 2016-06-15
      • 2020-07-19
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-02
      相关资源
      最近更新 更多