Как десериализовать словарь, используя DataContractJsonSerializer? - PullRequest
5 голосов
/ 17 ноября 2010

У меня есть следующая модель:

[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 не может десериализовать JSON в словарь (см. Раздел дополнительных сведений).
К сожалениюDataContractJsonSerializer также запечатан по причинам, которые мне не известны.
Мне нужен способ обойти это, кто-нибудь получил подсказку?

1 Ответ

5 голосов
/ 17 ноября 2010

Поскольку в 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"}

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


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

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

...