Есть ли способ разобрать JSON с запятыми в Ruby? - PullRequest
1 голос
/ 08 октября 2019

В настоящее время я кодирую переход от системы, которая использовала созданные вручную файлы JSON, к системе, которая может автоматически генерировать файлы JSON. Старая система работает;новая система работает;мне нужно перенести данные из старой системы в новую.

Файлы JSON используются приложением iOS для обеспечения функциональности и никогда ранее не читались нашим серверным программным обеспечением в Ruby On Rails. ,Чтобы выполнить преобразование между исходной системой и новой системой, я начал работу по синтаксическому анализу существующих файлов JSON.

Проблема заключается в том, что один из моих первых двух файлов примеров имеет запятые в JSON:

{ "sample data": [1, 2, 3,] }

Это, очевидно, прошло хорошо с приложением для iOS, потому что этот файл использовался некоторое время. Теперь мне нужен какой-то способ для анализа данных, представленных в файле на моем сервере Ruby on Rails, который (вполне справедливо) выдает исключение из-за недопустимой запятой в файле JSON.

Я не могу просто JSON.parse код, потому что синтаксический анализатор совершенно справедливо отклоняет его как недействительный JSON. Есть ли какой-то способ его проанализировать - вариант, который я могу передать в JSON.parse, или гем, который что-то добавляет, и т. Д. И т. Д.? Или мне нужно сообщить, что нам придется вручную исправить поврежденные файлы, прежде чем автоматизированный процесс сможет их обработать?

Редактировать:

На основании комментариев и запросовПохоже, что некоторые дополнительные данные требуются. Рассматриваемые файлы JSON хранятся в файлах .zip на S3, которые хранятся в ActiveStorage. Процесс, который я пишу, должен загружать, распаковывать и анализировать zip-файлы, используя файл 'manifest.json' в качестве ключа для преобразования архивного файла в структуру базы данных с несколькими меньшими файлами, хранящимися на S3 вместо одногопочтовый индекс, который содержит все. (Очень) долгосрочная цель состоит в том, чтобы клиенты прекратили скачивать унитарный zip-файл и вместо этого скачивали файлы по отдельности. Первый шаг к этому - разбить zip-файлы на server , что означает, что сервер должен читать zip-файлы. Более подробная выборка данных приведена ниже. (Обратите внимание, что структура содержит несколько проектных решений, о которых я позже пожалел; одна из первоначальных идей состояла в том, чтобы иметь возможность повторно использовать файлы, а не упаковывать несколько копий одного и того же идентичного файла, но YAGNI укусил меня сзади)

Следующее включает комментарии, которые не являются законными в формате JSON:

{
  "defined_key": [
    {
      "name": "Object_with_subkeys",
      "key": "filename",
      "subkeys": [
        {
          "id":"1"
        },
        {
          "id":"2"
        },
        {
          "id":"3" // references to identifier on another defined key
        }, // Note trailing comma
      ]
    }
  ],
  "another_defined_key":[
    {
      "identifier": "should have made parent a hash with id as key instead of an array",
      "data":"metadata",
      "display_name":"Names: Can be very arbitrary",
      "user text":"Wait for the right {moment}", // I actually don't expect { or } in the strings, but they're completely legal and may have been used
      "thumbnail":"filename-2.png",
      "video-1":"filename-3.mov"
    }
  ]
}

1 Ответ

3 голосов
/ 08 октября 2019

Проблема в том, что вы пытаетесь проанализировать что-то похожее на JSON, но на самом деле это не JSON, как определено в спецификации.

Массивы. Структура массива - это пара токенов в квадратных скобках, окружающих ноль или более значений. Значения разделены запятыми.

Поскольку у вас есть запятая, следует ожидать и другое значение, и большинство синтаксических анализаторов JSON выдают ошибку из-за этого нарушения

Все, что говорится json-next проанализирует это соответствующим образом, может быть, даст выстрел.

Он может анализировать JSON-подобные представления, которые полностью нарушают спецификацию JSON в зависимости от используемого вами аромата. (HanSON, SON, JSONX, как определено в геме)

Пример:

json = "{ \"sample data\": [1, 2, 3,] }")
require 'json/next'
HANSON.parse(json)
#=> {"sample data"=>[1, 2, 3]}

, но следующее эквивалентно и полностью нарушает спецификацию

JSONX.parse("{ \"sample data\": [1 2 3] }")
#=> {"sample data"=>[1, 2, 3]} 

Так что если выпри выборе этого маршрута не рассчитывайте использовать его для проверки данных или структуры JSON каким-либо образом, и вы можете получить непредвиденные результаты.

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