2010-11-16 31 views
5

tôi có mô hình sau:Làm thế nào để deserialize một từ điển bằng cách sử dụng DataContractJsonSerializer?

[DataContract] 
public class MessageHeader 
{ 
    private Guid? messageId; 

    public Guid MessageId 
    { 
     get 
     { 
      if (messageId == null) 
       messageId = Guid.NewGuid(); 

      return messageId.Value; 
     } 
    } 

    [DataMember] 
    public string ObjectName { get; set; } 

    [DataMember] 
    public Dictionary<string, object> Parameters { get; set; } // Can't deserialize this 

    [DataMember] 
    public Action Action { get; set; } 

    [DataMember] 
    public User InitiatingUser { get; set; } 
} 

Bây giờ đối với một số lý do không rõ, DataContractJsonSerializer can't deserialize JSON into a dictionary (Xem thêm phần chi tiết).
Thật không may DataContractJsonSerializer cũng được niêm phong vì những lý do vượt ra ngoài tôi.
Tôi cần một cách để vượt qua nó, có ai có đầu mối không?

Trả lời

5

Vì không có loại từ điển nào trong javascript nên rất khó để có JSON thô thành một. Những gì bạn sẽ phải làm là viết một công cụ chuyển đổi cho mình.

Tuy nhiên, điều đó cũng đúng trên hầu hết các đối tượng tuần tự hóa tùy chỉnh, vì vậy hy vọng điều đó không có gì đáng ngạc nhiên lớn.

Bây giờ, bạn nên đọc trong vai trò là một KeyValuePair để bạn có thể thử điều đó, để xem liệu nó có ít nhất là deserializing cho bạn hay không. Thay vào đó, bạn sẽ cần một List<KeyValuePair<>>

Thật là một Dictionary<string,string> chuyển thành cho JSON:

var dict = new Dictionary<string,string>; 
dict["Red"] = "Rosso"; 
dict["Blue"] = "Blu"; 
dict["Green"] = "Verde"; 

[{"Key":"Red","Value":"Rosso"}, 
{"Key":"Blue","Value":"Blu"}, 
{"Key":"Green","Value":"Verde"}] 

Cùng kết hợp từ javascript vào JSON:

var a = {}; 
a["Red"] = "Rosso"; 
a["Blue"] = "Blu"; 
a["Green"] = "Verde"; 

{"Red":"Rosso","Blue":"Blu","Green":"Verde"} 

Vì vậy, có vấn đề trong một nutshell.


Một số liên kết followup cho tính hữu dụng

http://my6solutions.com/post/2009/06/17/The-serialization-and-deserialization-of-the-generic-Dictionary-via-the-DataContractJsonSerializer.aspx

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.collectiondatacontractattribute.aspx

+0

Tại sao không thể DataContractJsonSerializer serialize điển như: từ điển [ "ObjectName"] = giá trị gia tăng; –

+0

Ngoài ra, CollectionDataContractAttribute không áp dụng cho DataContractJsonSerializer, một lần nữa vì lý do hoàn toàn không có. Về liên kết đầu tiên, tôi phải làm gì nếu tôi không có JavaScriptSerializer vì nó là một Web DLL. –

+0

vì đó là một tệp 'Web' dll? Tôi không hiểu? Bạn có thể sử dụng bất kỳ thư viện nào trong .NET GAC chỉ bằng cách tham chiếu nó. Đó là sức mạnh của thư viện .NET. Chỉ vì nó ở trong System.Web hoặc bất cứ điều gì, điều đó không có nghĩa gì cả. Nó chỉ là một không gian tên để tổ chức hợp lý các đối tượng, phương pháp và tương tự. Và như cho _Why không thể DCJS serialize từ điển đó way_, idk, nhưng tôi đã cho bạn thấy vấn đề ở trên. – jcolebrand

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