Подтвердить что ты не робот

Любой способ заставить DataContractJsonSerializer правильно сериализовать словари?

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

4b9b3361

Ответ 1

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

var serializer = new DataContractJsonSerializer(typeOfObj, new DataContractJsonSerializerSettings()
{
    UseSimpleDictionaryFormat = true 
});

Ответ 2

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

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

Ответ 3

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

Ответ 4

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