Разбор строки JSON без кавычек

У меня есть код, как показано ниже (он просто редактирует JSON и добавляет новые вещи на место, указанное JSONPath):

JToken jp = JToken.Parse(json);
IEnumerable<JToken> nd = jp.SelectTokens(path);

JToken newj = JToken.Parse(newval);

foreach (JToken vl in nd)
    ((JToken)value).Replace(newj);

json, path, newval — это строки. У меня нет проблем, когда я пытаюсь добавить новый тип int, float, date, bool, null и т. д. Проблема в том, что я пытаюсь добавить строку. Формат с кавычками правильный ("новостная строка"), но мне нужно добавить строку и без кавычек, но у меня есть исключение ("Неожиданный конец при чтении JSON. Путь ''[...]).

Есть ли возможность анализировать строку без кавычек?


person James The Evangelist    schedule 13.04.2016    source источник
comment
Чем мы можем помочь, если вы не опубликуете строку Json? Кроме того, почему вы собираетесь анализировать строку, если значение не является строкой, т.е. оно не заключено в кавычки?   -  person Panagiotis Kanavos    schedule 13.04.2016
comment
Это может быть любой допустимый JSON. Я получаю значение для редактирования формы пользователя, поэтому, если пользователь забыл о кавычках (если хочет добавить строку), я не знаю, есть ли способ добавить кавычки в код.   -  person James The Evangelist    schedule 13.04.2016
comment
JSON использует кавычки для разделения строк. Если ввод не имеет кавычек, это недопустимый JSON. Вы также не можете догадаться, как восстановить - новые строки допустимы в строке, поэтому остальную часть файла можно считать одной строкой. Кроме того, зачем пользователю вводить текст напрямую? Разве не должен быть шаг validation, который предотвратит создание недопустимого JSON?   -  person Panagiotis Kanavos    schedule 13.04.2016
comment
Что такое «строка без кавычек»? Кавычки используются в C# только для работы со строковыми значениями, но когда дело доходит до сериализации, он сериализует строку без кавычек. Но формат json требует кавычек для пары ключ/значение, и сериализатор автоматически добавляет их в соответствии с требованиями форматирования.   -  person Fabjan    schedule 13.04.2016
comment
Допустимая строка @Fabjan для JSON с точки зрения C#: \string\. Я хочу разобрать строку, которая выглядит как строка (без экранирования).   -  person James The Evangelist    schedule 13.04.2016
comment
Экранирующие символы @JamesTheEvangelist присутствуют только потому, что в противном случае невозможно использовать двойные кавычки внутри приложения C#. Таким образом, эта строка - \text\ внутри сериализуемого приложения С# станет текстом, который именно так должен быть отформатирован значением json - propname: value   -  person Fabjan    schedule 13.04.2016


Ответы (1)


Строка в формате JSON определяется как

Строка представляет собой последовательность кодовых точек Unicode, заключенных в кавычки (U+0022).

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

Кстати, JSON также не определяет даты. Формат ISO 8601 используется по соглашению.

person Panagiotis Kanavos    schedule 13.04.2016
comment
Как вы написали в комментарии, теперь я проверяю текстовое поле вводом и не позволяю пользователям записывать значения без кавычек. - person James The Evangelist; 13.04.2016
comment
Почему бы вам не обернуть строки в \" самостоятельно? - person Toxantron; 13.04.2016
comment
@Toxantron, потому что в коде невозможно угадать. Строки JSON могут иметь новые строки, что означает, что все до конца файла может быть допустимой строкой. Вы даже не можете предположить, что строка не пересекает линии, так как текст вводится конечными пользователями. - person Panagiotis Kanavos; 13.04.2016