Разбор JSON без каких-либо преобразований в Ruby

Я пишу скрипт Ruby для переноса файлов JSON из одного формата в другой. При этом мне нужно сохранить точное содержимое и форматирование всех значений. Есть ли в Ruby библиотека JSON, которая будет анализировать файл без какой-либо проверки или преобразования значений, просто оставляя их в виде строк?

Библиотека JSON по умолчанию преобразует все числа в формат с плавающей запятой, часто теряя точность. OJ может выполнить синтаксический анализ BigDecimal, но затем выведет все числа в экспоненциальной записи. Ни то, ни другое не позволяет мне вообще пропустить преобразование.

🤔 А знаете ли вы, что...
В Ruby все является объектом, включая числа и функции.


73
1

Ответ:

Решено

Если вас интересует только анализ десятичных чисел, есть опция decimal_class. Вы можете использовать это, чтобы выбрать другой класс, например BigDecimal, или предоставить свой собственный синтаксический анализатор:

string = "{\"num\":222.95816040039063}"

JSON.parse(string)
 => {"num"=>222.95816040039062}

JSON.parse(string, decimal_class: BigDecimal)
 => {"num"=>0.22295816040039063e3}

class NoConversion
  def initialize(raw)
    @raw = raw
  end
end
JSON.parse(string, decimal_class: NoConversion)
 => {"num"=>#<NoConversion:0x0000000110509a90 @raw = "222.95816040039063">}

И, как отметил @Stefan, вы можете определить метод to_json для генерации JSON из пользовательского десятичного класса:

class NoConversion
  def initialize(raw)
    @raw = raw
  end

  def to_json(*)
    @raw
  end
end

hash = JSON.parse(string, decimal_class: NoConversion)
 => {"num"=>#<NoConversion:0x0000000110511fd8 @raw = "222.95816040039063">}

JSON.generate(hash)
 => "{\"num\":222.95816040039063}"