2012-02-02 46 views
115

我有一個對象模型,看起來像這樣:序列化列表,以JSON

public MyObjectInJson 
{ 
    public long ObjectID {get;set;} 
    public string ObjectInJson {get;set;} 
} 

酒店ObjectInJson是一個已經序列化版本包含嵌套表的對象。目前,我手動序列化的MyObjectInJson名單如下:

StringBuilder TheListBuilder = new StringBuilder(); 

TheListBuilder.Append("["); 
int TheCounter = 0; 

foreach (MyObjectInJson TheObject in TheList) 
{ 
    TheCounter++; 
    TheListBuilder.Append(TheObject.ObjectInJson); 

    if (TheCounter != TheList.Count()) 
    { 
    TheListBuilder.Append(","); 
    } 
} 
TheListBuilder.Append("]"); 

return TheListBuilder.ToString(); 

我不知道如果我可以JavascriptSerializer代替這種危險的代碼,並得到相同的結果。 我該怎麼做?

謝謝。

回答

220
// you need to reference System.Web.Extensions 

using System.Web.Script.Serialization; 

var jsonSerialiser = new JavaScriptSerializer(); 
var json = jsonSerialiser.Serialize(aList); 

請注意:

時代變了,我會默認使用JSON.Net作爲我的第一選擇JSON解析器。如果它是WebAPI的正確選擇,它是我的正確選擇。

例如

using Newtonsoft.Json; 

var json = JsonConvert.SerializeObject(aList); 

您可能需要先安裝軟件包。

PM> Install-Package Newtonsoft.Json 

欲瞭解更多詳情see and upvote the answer that is the source of this information

+1

好的,它也可以序列化對象列表,而不僅僅是對象本身。謝謝。 – frenchie 2012-02-02 10:48:39

+0

doesen't不像循環關係,但這不是一個問題 – Jodrell 2012-02-02 10:53:12

+12

請注意,這個命名空間是狡猾地藏在System.Web.Extensions中。一旦您將其作爲參考添加,該解決方案出色! – 2013-05-09 16:25:08

9

有這樣做有兩種常見的方法內置JSON序列化:

  1. JavaScriptSerializer

    var serializer = new JavaScriptSerializer(); 
    return serializer.Serialize(TheList); 
    
  2. DataContractJsonSerializer

    var serializer = new DataContractJsonSerializer(TheList.GetType()); 
    using (var stream = new MemoryStream()) 
    { 
        serializer.WriteObject(stream, TheList); 
        using (var sr = new StreamReader(stream)) 
        { 
         return sr.ReadToEnd(); 
        } 
    } 
    

    注意,這個選項需要定義您所在班級的數據合同:

    [DataContract] 
    public class MyObjectInJson 
    { 
        [DataMember] 
        public long ObjectID {get;set;} 
        [DataMember] 
        public string ObjectInJson {get;set;} 
    } 
    
3

.NET已經支持通過System.Runtime.Serialization.Json namespace和基本的JSON序列化自3.5版本DataContractJsonSerializer類。顧名思義,DataContractJsonSerializer會考慮添加到對象中的任何數據註釋以創建最終的Json輸出。

如果您已經有註釋的數據類,並且想要將Json序列化爲流,那麼這很方便,如How To: Serialize and Deserialize JSON Data中所述。有一些限制,但如果您有基本需求並且不想將另一個庫添加到您的項目中,它就足夠好並且足夠快。

以下代碼將列表序列化爲控制檯輸出流。正如你所看到的,它是一個比Json更詳細。NET,而不是類型安全的(即沒有仿製藥)

 var list = new List<string> {"a", "b", "c", "d"}; 

     using(var output = Console.OpenStandardOutput())     
     {     
      var writer = new DataContractJsonSerializer(typeof (List<string>)); 
      writer.WriteObject(output,list); 
     } 

在另一方面,Json.NET提供瞭如何生成JSON更好地控制。這會非常方便,當你有映射的JavaScript友好的名稱名稱.NET類,日期格式爲JSON等

另一種選擇是ServiceStack.Text,該ServicStack的一部分...棧,它提供了一組用於Json,JSV和CSV的非常快速的序列化器。

81

你也可以使用Json.NET。只需在http://james.newtonking.com/pages/json-net.aspx下載它,提取壓縮文件並將其添加爲參考。

然後,只需用下面的序列列表(或任何你想要的對象):

using Newtonsoft.Json; 

string json = JsonConvert.SerializeObject(listTop10); 

更新:您還可以將其通過NuGet包管理器添加到您的項目(工具 - > NuGet包管理器 - >軟件包管理器控制檯):

PM> Install-Package Newtonsoft.Json 

文檔:Serializing Collections

+6

或使用nuget http://www.nuget.org/packages/newtonsoft.json/ – Jodrell 2013-12-03 10:20:26

2
public static string JSONSerialize<T>(T obj) 
     { 
      string retVal = String.Empty; 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType()); 
       serializer.WriteObject(ms, obj); 
       var byteArray = ms.ToArray(); 
       retVal = Encoding.UTF8.GetString(byteArray, 0, byteArray.Length); 
      } 
      return retVal; 
     }