2012-02-02 39 views
115

Tôi có một mô hình đối tượng trông như thế này:Serializing một danh sách để JSON

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

Thuộc tính ObjectInJson là một phiên bản đã được tuần tự một đối tượng có chứa danh sách lồng nhau. Đối với thời điểm hiện tại, tôi đang serializing danh sách các MyObjectInJson bằng tay như thế này:

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

Tôi tự hỏi nếu tôi có thể thay thế loại này mã nguy hiểm với JavascriptSerializer và nhận được kết quả tương tự. Tôi sẽ làm như thế nào?

Cảm ơn.

Trả lời

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

using System.Web.Script.Serialization; 

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

Xin lưu ý:

Times đã thay đổi, tôi sẽ mặc định sử dụng JSON.Net là sự lựa chọn đầu tiên của tôi JSON Parser. Nếu nó là lựa chọn đúng đắn cho WebAPI, đó là lựa chọn đúng đắn cho tôi.

ví dụ:

using Newtonsoft.Json; 

var json = JsonConvert.SerializeObject(aList); 

bạn có thể cần cài đặt gói trước.

PM> Install-Package Newtonsoft.Json 

Để biết thêm chi tiết see and upvote the answer that is the source of this information.

+1

ah ok, nó C serialNG cũng sắp xếp danh sách các đối tượng chứ không phải chỉ các đối tượng. Cảm ơn. – frenchie

+0

không giống như các mối quan hệ theo chu kỳ nhưng đó không phải là một vấn đề ở đây – Jodrell

+12

Lưu ý rằng không gian tên này được khéo léo giấu trong System.Web.Extensions. Một khi bạn thêm nó như là một tham chiếu, giải pháp hoạt động rực rỡ! –

9

Có hai cách phổ biến để làm điều đó với built-in JSON serializers:

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

    Lưu ý, rằng tùy chọn này đòi hỏi phải định nghĩa hợp đồng dữ liệu cho lớp học của bạn:

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

NET đã hỗ trợ serialization Json cơ bản thông qua các System.Runtime.Serialization.Json namespaceDataContractJsonSerializer lớp kể từ phiên bản 3.5. Như tên của nó, DataContractJsonSerializer đưa vào tài khoản bất kỳ chú thích dữ liệu nào bạn thêm vào đối tượng của mình để tạo ra kết quả Json cuối cùng.

Điều đó có thể hữu ích nếu bạn đã có các lớp dữ liệu được chú thích mà bạn muốn tuần tự hóa Json thành luồng, như được mô tả trong How To: Serialize and Deserialize JSON Data. Có những hạn chế nhưng nó đủ tốt và đủ nhanh nếu bạn có nhu cầu cơ bản và không muốn thêm một thư viện khác vào dự án của bạn.

Mã sau nối tiếp danh sách với luồng đầu ra của bảng điều khiển. Như bạn thấy, nó là một chi tiết dài hơn bit so với Json.NET và không loại an toàn (tức là không có generics)

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

Mặt khác, Json.NET cung cấp kiểm soát tốt hơn cách bạn tạo ra Json. Điều này sẽ đến RẤT tiện dụng khi bạn phải ánh xạ các tên tên thân thiện với javascript vào các lớp .NET, định dạng ngày tháng tới json, v.v.

Một tùy chọn khác là ServiceStack.Text, một phần của ngăn xếp ServicStack ..., cung cấp một bộ serializers rất nhanh cho Json, JSV và CSV.

81

Bạn cũng có thể sử dụng Json.NET. Chỉ cần tải xuống tại http://james.newtonking.com/pages/json-net.aspx, trích xuất tệp nén và thêm tệp đó dưới dạng tham chiếu.

Sau đó chỉ cần serialize danh sách (hoặc bất kỳ đối tượng bạn muốn) như sau:

using Newtonsoft.Json; 

string json = JsonConvert.SerializeObject(listTop10); 

Cập nhật: bạn cũng có thể thêm nó vào dự án của bạn thông qua NuGet Package Manager (Tools -> NuGet Package Manager -> Package Manager Console):

PM> Install-Package Newtonsoft.Json 

Tài liệu: Serializing Collections

+6

hoặc sử dụng nuget http://www.nuget.org/packages/newtonsoft.json/ – Jodrell

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; 
     } 
Các vấn đề liên quan