2011-02-01 53 views
48

Có thể tuần tự hóa từ .Net Dictionary < Key, Value > thành JSON với DataContractJsonSerializer đó là các định dạng:C# JSON serialization của từ điển thành {key: value, ...} thay vì {key: key, value: value, ...}

{ 
    key0:value0, 
    key1:value1, 
    ... 
} 

tôi sử dụng từ điển < K, V >, bởi vì không có cấu trúc được xác định trước của đầu vào.

Tôi chỉ thích thú với kết quả DataContractJsonSerializer! Tôi đã tìm thấy một ví dụ "Thay thế", nhưng có một "dữ liệu" bổ sung trong đầu ra, và nếu từ điển < K, Chuỗi > là, việc thoát là sai quá.


Tôi đã tìm thấy giải pháp, những gì cần thiết! Trước hết, một serializable "từ điển" class: (Tất nhiên, mẫu này hoạt động giống theo cách này, nhưng tôi dont't cần deserialization)

[Serializable] 
public class MyJsonDictionary<K, V> : ISerializable { 
    Dictionary<K, V> dict = new Dictionary<K, V>(); 

    public MyJsonDictionary() { } 

    protected MyJsonDictionary(SerializationInfo info, StreamingContext context) { 
     throw new NotImplementedException(); 
    } 

    public void GetObjectData(SerializationInfo info, StreamingContext context) { 
     foreach(K key in dict.Keys) { 
      info.AddValue(key.ToString(), dict[ key ]); 
     } 
    } 

    public void Add(K key, V value) { 
     dict.Add(key, value); 
    } 

    public V this[ K index ] { 
     set { dict[ index ] = value; } 
     get { return dict[ index ]; } 
    } 
} 

Cách sử dụng:

public class MainClass { 
    public static String Serialize(Object data) { 
     var serializer = new DataContractJsonSerializer(data.GetType()); 
     var ms = new MemoryStream(); 
     serializer.WriteObject(ms, data); 

     return Encoding.UTF8.GetString(ms.ToArray()); 
    } 

    public static void Main() { 
     MyJsonDictionary<String, Object> result = new MyJsonDictionary<String, Object>(); 
     result["foo"] = "bar"; 
     result["Name"] = "John Doe"; 
     result["Age"] = 32; 
     MyJsonDictionary<String, Object> address = new MyJsonDictionary<String, Object>(); 
     result["Address"] = address; 
     address["Street"] = "30 Rockefeller Plaza"; 
     address["City"] = "New York City"; 
     address["State"] = "NY"; 

     Console.WriteLine(Serialize(result)); 

     Console.ReadLine(); 
    } 
} 

Và kết quả:

{ 
     "foo":"bar", 
     "Name":"John Doe", 
     "Age":32, 
     "Address":{ 
     "__type":"MyJsonDictionaryOfstringanyType:#Json_Dictionary_Test", 
     "Street":"30 Rockefeller Plaza", 
     "City":"New York City", 
     "State":"NY" 
     } 
    } 
+7

Bất kỳ lý do cụ thể nào bạn muốn giới hạn đối với 'DataContractJsonSerializer'? Mỗi khi tôi đã thực hiện một so sánh (đó là nhiều lần: Tôi rất "vào" serializers của tôi) đây là công cụ JSON ít thích hợp nhất cho. NET; Tôi luôn xem JavaScriptSerializer hoặc JSON.Net –

+0

Bạn đang sử dụng ngữ cảnh nào? Đó là đây là một ứng dụng WCF, ứng dụng ASP.NET hoặc cái gì khác. Bạn đang sử dụng DataContractJsonSerilizer trong chẳng hạn như cách mà bạn đang gọi các WriteObject mình hoặc là một số khuôn khổ làm điều đó cho bạn? –

+0

Điều không rõ ràng trong bài đăng của bạn là bạn muốn 1 đối tượng JSON có thuộc tính (và giá trị của chúng) là cặp tên/giá trị trong từ điển. Hoặc đó là một cái gì đó là sai vì nó không thể là một mảng JSON vì bạn không thể có một mảng JSON trong đó mỗi phần tử trong mảng có các tên thuộc tính khác nhau. Vì vậy, bạn có thể được rõ ràng về các định dạng thực tế bạn đang tìm kiếm để có được? –

Trả lời

4

Tôi đang sử dụng ra khỏi MVC4 hộp với mã này (lưu ý hai tham số bên trong ToDictionary)

var result = new JsonResult() 
{ 
    Data = new 
    { 
     partials = GetPartials(data.Partials).ToDictionary(x => x.Key, y=> y.Value) 
    } 
}; 

tôi nhận được những gì đang mong đợi:

{"partials":{"cartSummary":"\u003cb\u003eCART SUMMARY\u003c/b\u003e"}} 

quan trọng: WebAPI trong MVC4 sử dụng tuần tự JSON.NET ra khỏi hộp, nhưng kết quả hành động web tiêu chuẩn JsonResult thì không. Vì vậy, tôi khuyên bạn nên sử dụng một ActionResult tùy chỉnh để buộc JSON.NET tuần tự hóa. Bạn cũng có thể có được tốt đẹp định dạng

Dưới đây là một ActionResult đơn giản JsonNetResult

http://james.newtonking.com/archive/2008/10/16/asp-net-mvc-and-json-net.aspx

Bạn sẽ thấy sự khác biệt (và có thể chắc chắn rằng bạn đang sử dụng một trong những quyền) khi tuần tự một ngày:

Cách của Microsoft:

{"wireTime":"\/Date(1355627201572)\/"} 

JSON.NET cách:

{"wireTime":"2012-12-15T19:07:03.5247384-08:00"} 
35

Json.NET thực hiện điều này ...

Dictionary<string, string> values = new Dictionary<string, string>(); 
values.Add("key1", "value1"); 
values.Add("key2", "value2"); 

string json = JsonConvert.SerializeObject(values); 
// { 
// "key1": "value1", 
// "key2": "value2" 
// } 

Thêm ví dụ: Serializing Collections with Json.NET

+0

Dòng thứ hai nên là 'chuỗi giá trị = JsonConvert.SerializeObject (giá trị);' –

11

sử dụng tài sản UseSimpleDictionaryFormat trên DataContractJsonSerializer và đặt nó vào true.

Công việc có phải không :)

+0

làm thế nào bạn có thể thiết lập các thiết lập cho hành vi mặc định của wcf khi serializing câu trả lời http? – Vinhent

+0

Làm việc cho tôi, cảm ơn! Tôi đã phải sử dụng 'config.Formatters.JsonFormatter.UseDataContractJsonSerializer = true;' trong 'WebApiConfig.cs'. – SharpC

+0

Tôi yêu bạn vì người trả lời này! Cứu tôi! <3 – Jules

Các vấn đề liên quan