Разбор или исправление JSON со специальными «неопределенными» значениями?

В дополнение к строкам и числам действительный JSON может содержать специальные значения, такие как null и false.

Мне нужно проанализировать JSON, сгенерированный некоторым API, который также содержит undefined. Однако undefined является допустимым значением JavaScript, но не является допустимым значением JSON, и всякий раз, когда я его анализирую, он возвращает лексическая ошибка.

Примеры:

library(jsonlite)

# A string works
"[{\"Sepal.Width\":\"3.5\"}]" %>% fromJSON
#  Sepal.Width
#         3.5

# A number works
"[{\"Sepal.Width\":3.5}]"  %>% fromJSON
#  Sepal.Width
#         3.5

# null works
"[{\"Sepal.Width\": null}]" %>% fromJSON
#  Sepal.Width
#          NA

# false works
 "[{\"Sepal.Width\": false}]" %>% fromJSON
#  Sepal.Width
#       FALSE

# undefined does not work
 "[{\"Sepal.Width\": undefined}]" %>% fromJSON
Error: lexical error: invalid char in json text.
                      [{"Sepal.Width": undefined}]
                     (right here) ------^

Вопрос:

Есть ли (надежный) способ проанализировать JSON, содержащий значения undefined? Если нет, то как лучше всего исправить этот неисправный JSON?

Пытаться:

Я думал о простом gsubbbing undefined, но это рискованно, так как это слово может легко существовать в строковых значениях JSON.


person stevec    schedule 12.12.2019    source источник
comment
Поскольку undefined не является допустимым значением JSON, вы вряд ли найдете синтаксический анализатор, который будет рассматривать его как единое целое. Как вы получаете undefined в своем JSON в первую очередь?   -  person SymbolixAU    schedule 13.12.2019
comment
@SymbolixAU есть ошибка в каком-то JSON, который я пытаюсь разобрать, и это приводит к тому, что (недействительный) undefined появляется в допустимом в остальном JSON. Я попытался клонировать исходный код jsonlite и внести коррективы, чтобы undefined можно было анализировать, как если бы это было логическое значение или null, но я не продвинулся слишком далеко. Здесь находится источник недопустимого JSON.   -  person stevec    schedule 13.12.2019
comment
@user5783745 user5783745 У вашего генератора JSON, скорее всего, проблема.   -  person Ṃųỻịgǻňạcểơửṩ    schedule 22.12.2019
comment
@Ḿűỻịgǻṇạcểơửṩᛗ Я знаю. Хотя это не мой API. Я просто пытаюсь проанализировать полученный ответ (я не могу контролировать ответ и, следовательно, действительность JSON, я могу контролировать только то, как я анализирую ответ). Другие указали, что ответ недействителен JSON, что я полностью понимаю. Я думаю, что лучшим решением является чтение ответа в виде текста и замена undefined на false. Однако это рискованно, поскольку это может изменить фактические строковые значения (например, если в строковых значениях JSON появляется «неопределенное»).   -  person stevec    schedule 23.12.2019
comment
Тогда, к сожалению, сам API неисправен. Не могли бы вы отредактировать свой вопрос, чтобы в нем упоминался API и то, как он создает undefined-JSON. Какой API вы используете?   -  person Ṃųỻịgǻňạcểơửṩ    schedule 23.12.2019
comment
@Ḿűỻịgǻṇạcểơửṩᛗ см. здесь   -  person stevec    schedule 23.12.2019


Ответы (2)


Нет. Вы не можете анализировать JSON с неопределенным значением; undefined действительно является специальным значением. Фактически, undefined как «значение» не должно встречаться в действительном JSON и означает, что «этот ключ [в вашем случае "Sepal.Width"] не существует». Вместо этого API, скорее всего, неисправен, поскольку генерирует JSON со значениями undefined.

Официальный источник, обмен данными в формате JSON. Синтаксис утверждает, что

Значение JSON может быть объектом, массивом, числом, строкой, значением true, false или null.

Лучшее средство — изучить генератор JSON или API и понять, почему он генерирует undefined в JSON. Вы также можете вручную или алгоритмически исправить дефектный JSON и проверить, есть ли какие-либо несоответствия в вашем JSON.

person Ṃųỻịgǻňạcểơửṩ    schedule 13.12.2019

Для справки, я использовал str_replace_all(), чтобы заменить :undefined на :"undefined".

Это несколько рискованно, потому что это вызовет проблемы, если строка :undefined появится в фактических строковых значениях в JSON, но в моем случае это (несовершенное) решение

str_replace_all(invalid_json, ':undefined', ':"undefined"')
person stevec    schedule 30.12.2019
comment
Это хороший подход. Чтобы проверить такое решение, проверьте все вхождения undefined и убедитесь, что ваша замена не вызывает неожиданного поведения. Как вы думаете, вы сейчас спрашиваете, как удалить неопределенные значения в неправильно сгенерированном JSON? - person Ṃųỻịgǻňạcểơửṩ; 30.12.2019
comment
@Ḿűỻịgǻṇącểơửṩᛗ Думаю, да. Первоначально я надеялся, что есть какой-то способ проанализировать недопустимый JSON, поскольку какой-то вариант javascript (поскольку undefined) является допустимым javascript, а затем преобразовать в действительный JSON. Но я не думаю, что такой подход возможен - person stevec; 31.12.2019