Как десериализовать строку json с дополнительным "" - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть входная строка Json, которую я пытаюсь десериализовать

 {
      "ID":1,
      "Details":{
      "Product":""Boston,saline"",
      "cost":150.0
      } 
 }

или

   {
      "ID":1,
      "Details":{
      "Product":"Boston "Sample"",
      "cost":150.0
      } 
 }

Когда я пытаюсь использовать $JsonConvert.DeserializeObject<JObject>(input), это дает мне сообщение об ошибке "After parsing a value an unexpected character was encountered" иэто ожидается.Есть ли способ, которым мы можем десериализовать этот тип строк?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Вы не можете.

Скажите, что пользователь может создать продукт с именем ", "x": "y.Это будет представлено как (неправильно сериализовано)

"Details": {
    "Product": "", "x": "y",
    "cost": 150.0
}

Это допустимый JSON, поэтому нет синтаксического способа обнаружить, что что-то не так.

Еще хуже, что если злоумышленник создастпродукт с именем ", "cost": 1.0, "x": "y.Это будет представлено как (с некоторым примененным форматированием)

"Details": {
    "Product": "",
    "cost": 1.0,
    "x": "y",
    "cost": 150.0
}

Что будет делать с этим ваш десериализатор?Это примет это?(Некоторые будут.) Будет ли он использовать первый "cost" или второй "cost", то есть позволит ли злоумышленнику снизить стоимость?И сможет ли злоумышленник создать дубликат "cost" после реального?И даже если в настоящее время все в порядке при десериализации этой строки, будет ли она продолжать работать после обновления до новой версии библиотеки?

Начиная с 2017 года Json.net принимает такой JSON и использует второе повторяющееся значение (см. Json.net больше не выбрасывает в случае дубликата ).Но это поведение изменилось между версиями 6 и 8. Изменится ли оно снова?

Единственное реальное исправление - это исправить то, что генерирует этот JSON.

0 голосов
/ 12 февраля 2019

Материал в ваших примерах не JSON;вот почему у вас возникают проблемы с его анализом с помощью JSON-анализатора.

Попробуйте исправить либо то, как данные хранятся, либо как они читаются.

Вариант 1. Исправьте, как они хранятся.
Похоже, что строковое значение "blammy" на самом деле хранится в вашей БД в виде: \"blammy\".Это ноль процентов правильно.Значение, которое сохраняется в столбце вашей БД, должно быть blammy (обратите внимание, без кавычек).Исправьте эту проблему.

Вариант 2: Исправьте, как читается
Что-то читает значение столбца из вашей БД.Измените эту вещь, чтобы удалить внешние двойные кавычки из строковых данных.Тогда (неправильно) сохраненное значение \"blammy\" будет считано (и зафиксировано), чтобы оно было blammy.Это будет работать только с примером 1 в вашем вопросе.Вам нужно будет сделать что-то еще, если вы получите пример 2.

0 голосов
/ 12 февраля 2019

Не могли бы вы использовать .replace из нативного метода String для замены всех двойных двойных кавычек на одинарные двойные кавычки.

...