Я пишу скрипт Ruby для переноса файлов JSON из одного формата в другой. При этом мне нужно сохранить точное содержимое и форматирование всех значений. Есть ли в Ruby библиотека JSON, которая будет анализировать файл без какой-либо проверки или преобразования значений, просто оставляя их в виде строк?
Библиотека JSON по умолчанию преобразует все числа в формат с плавающей запятой, часто теряя точность. OJ может выполнить синтаксический анализ BigDecimal, но затем выведет все числа в экспоненциальной записи. Ни то, ни другое не позволяет мне вообще пропустить преобразование.
🤔 А знаете ли вы, что...
В Ruby все является объектом, включая числа и функции.
Если вас интересует только анализ десятичных чисел, есть опция 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}"