Любой способ заставить 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
Ответы
Ответ 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
, и он сериализует словари так, как вы ожидали.