Есть ли способ заставить DataContractJsonSerializer правильно сериализовать словари? - PullRequest
48 голосов
/ 30 декабря 2010

DataContractJsonSerializer не может правильно сериализовать словари.

Принимая во внимание, что JavaScriptSerializer сериализует словари как {"abc":"xyz","def":42} например, вместо этого DataContractJsonSerializer дает [{"Key":"abc","Value":"xyz"},{"Key":"def","Value":42}].

Это действительно проблематично, и я хочу знать, как правильно сериализовать объекты Dictionary в моей службе WCF. Я ищу решение, которое потребовало бы наименьшего количества усилий.

ref: http://msdn.microsoft.com/en-us/library/bb412170.aspx

Это обходной путь, который я наконец использовал для правильной сериализации словарей в WCF: http://social.msdn.microsoft.com/forums/en-US/wcf/thread/765f1569-0422-4471-8ec2-1d03b2026771

Ответы [ 4 ]

54 голосов
/ 01 декабря 2014

Использование DataContractJsonSerializerSettings (доступно с версии .NET 4.5) может сделать это за вас:

var serializer = new DataContractJsonSerializer(typeOfObj, new DataContractJsonSerializerSettings()
{
    UseSimpleDictionaryFormat = true 
});
29 голосов
/ 30 декабря 2010

К сожалению, это, кажется, является второстепенным, согласно разделу «Коллекции, словари и массивы» в http://msdn.microsoft.com/en-us/library/bb412170.aspx

Все коллекции, словари и массивы представлены в JSON как массивов.

9 голосов
/ 03 ноября 2011

Хотя в большинстве случаев это приведет к серьезной перезаписи и, следовательно, будет невозможно, вы можете разрешить своему интерфейсу службы WCF принимать и возвращать Stream, и в этом случае вы можете получить полный контроль над сериализацией. Таким образом, вы можете использовать JavaScriptSerializer, JSON.NET или ServiceStack.JSON для выполнения фактической сериализации, и эти сериализаторы на самом деле имеют дело со словарями более разумным способом.

7 голосов
/ 21 ноября 2014

DataContractJsonSerializerSettings теперь имеет свойство UseSimpleDictionaryFormat и сериализует словари так, как вы ожидаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...