2010-11-16 3 views
5

У меня есть следующие модели:Как десериализовать словарь с помощью 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; } 
} 

Теперь по неизвестной причине, DataContractJsonSerializer can't deserialize JSON into a dictionary (см дополнительные данные раздел).
К сожалению, DataContractJsonSerializer также запечатан по причинам, которые выходят за рамки меня.
Мне нужен способ обойти это, кто-нибудь понял?

ответ

5

Поскольку в javascript нет словарного типа, довольно сложно удалить JSON в один. То, что вам нужно сделать, это написать конвертер самостоятельно.

Однако это также верно для большинства пользовательских объектов сериализации, поэтому, надеюсь, это не является большим сюрпризом.

Теперь он должен быть прочитан как KeyValuePair, чтобы вы могли попробовать это, чтобы убедиться, что он по крайней мере десериализуется для вас. Скорее всего, вам потребуется List<KeyValuePair<>>

Что Dictionary<string,string> выливается для 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"}] 

То же ассоциативный из JavaScript в JSON:

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

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

Так что проблема в двух словах.


Несколько Followup ссылки на полезность

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

Почему DataContractJsonSerializer не может сериализовать словарь как: словарь [ "ObjectName"] = значение; –

+0

Кроме того, CollectionDataContractAttribute не применяется к DataContractJsonSerializer, опять же без всякой причины. О первой ссылке, что мне делать, если у меня нет JavaScriptSerializer, так как это веб-DLL. –

+0

, так как это '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' Я не понимаю? Вы можете использовать любую библиотеку в .NET GAC, просто ссылаясь на нее. Это мощь библиотеки .NET. Просто потому, что это в System.Web или что-то еще, это ничего не значит. Это просто пространство имен для логической организации объектов, методов и т. П. А что касается _Why не может DCJS сериализовать словарь that way_, idk, но я показал вам проблему выше. – jcolebrand

Смежные вопросы