C # JSON Сериализация словаря в {ключ: значение, ...} вместо {ключ: ключ, значение: значение, ...} - PullRequest
56 голосов
/ 01 февраля 2011

Можно ли сериализовать словарь .Netв JSON с DataContractJsonSerializer , который имеет формат:

{
  key0:value0,
  key1:value1,
  ...
}

Я использую словарьпотому что нет предопределенной структуры входных данных.

Мне интересно только для DataContractJsonSerializer результата!Я уже нашел пример "Суррогат", но в выводе есть дополнительные "данные", и если словарьесть побег тоже ложный.


Я нашел решение, что нужно!Прежде всего, сериализуемый класс «словарь»: (Конечно, этот пример работает только одним способом, но мне не нужна десериализация)* И результат:

{
      "foo":"bar",
      "Name":"John Doe",
      "Age":32,
      "Address":{
         "__type":"MyJsonDictionaryOfstringanyType:#Json_Dictionary_Test",
         "Street":"30 Rockefeller Plaza",
         "City":"New York City",
         "State":"NY"
      }
   }

Ответы [ 5 ]

49 голосов
/ 31 января 2015

Json.NET делает это ...

Dictionary<string, string> values = new Dictionary<string, string>();
values.Add("key1", "value1");
values.Add("key2", "value2");

string json = JsonConvert.SerializeObject(values);
// {
//   "key1": "value1",
//   "key2": "value2"
// }

Дополнительные примеры: Сериализация коллекций с Json.NET

12 голосов
/ 21 июля 2015

используйте свойство UseSimpleDictionaryFormat для DataContractJsonSerializer и установите его на true.

Работает ли:)

4 голосов
/ 16 декабря 2012

Я использую из коробки MVC4 с этим кодом (обратите внимание на два параметра внутри ToDictionary)

 var result = new JsonResult()
 {
     Data = new
     {
         partials = GetPartials(data.Partials).ToDictionary(x => x.Key, y=> y.Value)
     }
 };

Я получаю то, что ожидается:

{"partials":{"cartSummary":"\u003cb\u003eCART SUMMARY\u003c/b\u003e"}}

Важно : WebAPI в MVC4 использует сериализацию JSON.NET "из коробки", но стандартный результат действия web JsonResult - нет.Поэтому я рекомендую использовать пользовательский ActionResult для принудительной сериализации JSON.NET.Вы также можете получить хорошее форматирование

Вот простой результат действия JsonNetResult

http://james.newtonking.com/archive/2008/10/16/asp-net-mvc-and-json-net.aspx

Вы увидите разницу (и можете убедиться, что вы используете1) при сериализации даты:

Microsoft путь:

 {"wireTime":"\/Date(1355627201572)\/"}

JSON.NET путь:

 {"wireTime":"2012-12-15T19:07:03.5247384-08:00"}
2 голосов
/ 03 февраля 2012

К сожалению, в настоящее время это невозможно в последней версии DataContractJsonSerializer.См .: http://connect.microsoft.com/VisualStudio/feedback/details/558686/datacontractjsonserializer-should-serialize-dictionary-k-v-as-a-json-associative-array

В настоящее время предлагается обходной путь - использовать JavaScriptSerializer, как предложено Марком выше.

Удачи!

0 голосов
/ 15 августа 2018

Класс MyJsonDictionary хорошо сработал для меня, за исключением того, что результирующий вывод кодируется в формате XML, поэтому «0» становится «0030 ». В настоящее время я застрял на .NET 3.5, как и многие другие, поэтому многие другие решения для меня недоступны. «Переворачивает картинки» с ног на голову и понял, что никогда не сможет убедить Microsoft предоставить мне нужный мне формат, но ...

строка json = XmlConvert.DecodeName (xmlencodedJson);

TADA!

Результат - то, что вы ожидаете увидеть - обычный читаемый человеком и не закодированный в XML. Работает в .NET 3.5.

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