Как правильно десериализовать строку Json - PullRequest
0 голосов
/ 12 июня 2019

У меня проблема при синтаксическом анализе строки Json в C # JObject. Конечный результат не согласуется с начальной строкой.

var original = "{\"System.String\":[\"AAEAAAD/////AQAAAAAAAAAGAQAAAA53d3cuZ29vZ2xlLmNvbQs=\", \"mscorlib\"],\"System.Boolean\":[\"AAEAAAD/////AQAAAAAAAAAEAQAAAA5TeXN0ZW0uQm9vbGVhbgEAAAAHbV92YWx1ZQABAAs=\", \"mscorlib\"],\"System.Boolean\":[\"AAEAAAD/////AQAAAAAAAAAEAQAAAA5TeXN0ZW0uQm9vbGVhbgEAAAAHbV92YWx1ZQABAAs=\", \"mscorlib\"]}";
var parsed = JObject.Parse(original);

Это работает, но мой разобранный объект на самом деле выглядит так:

{{
  "System.String": [
    "AAEAAAD/////AQAAAAAAAAAGAQAAAA53d3cuZ29vZ2xlLmNvbQs=",
    "mscorlib"
  ],
  "System.Boolean": [
    "AAEAAAD/////AQAAAAAAAAAEAQAAAA5TeXN0ZW0uQm9vbGVhbgEAAAAHbV92YWx1ZQABAAs=",
    "mscorlib"
  ]
}}

Как видите, убран один из объектов, почему?

Я также пытался использовать соответствующий конвертер

var parsed2 = JsonConvert.DeserializeObject<JObject>(original);

Можно ли обойти это, перегрузив настройки?

1 Ответ

1 голос
/ 12 июня 2019

JSON Не может содержать 2 элемента с одинаковым ключом.

System.Boolean присутствует дважды в вашем JSON.

Чтобы привести пример, почему это проблема, просто подумайте о том, чтовы ожидаете, что parsed["System.Boolean"] вернет?

Если анализируемый вами JSON создан вашей системой, вы можете изменить его так, чтобы он содержал массив объектов вместо пар ключ / значение непосредственно в нем.

Пример:

{ 
  "items" : [
      {
      "System.String": [
        "AAEAAAD/////AQAAAAAAAAAGAQAAAA53d3cuZ29vZ2xlLmNvbQs=",
        "mscorlib"]
      },
      {
        "System.Boolean": [
        "AAEAAAD/////AQAAAAAAAAAEAQAAAA5TeXN0ZW0uQm9vbGVhbgEAAAAHbV92YWx1ZQABAAs=",
        "mscorlib"]
      }
    ]
}
...