Как перегрузить JSON десериализацию поплавка? - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь выяснить, как я могу десериализовать json, например

 '{…, "money":{"amount":1.45674,"currency":"ETH"}, …}'

, в свой пользовательский класс или структуру или что-то еще, используя мою собственную функцию.Цель состоит в том, чтобы преобразовать число с плавающей точкой в ​​целое число без ошибок округления, и я хочу использовать свои собственные классы денег, в зависимости от названия валюты.Поэтому в середине преобразования не должно вмешиваться BigDecimal или другое числовое значение.

Или, может быть, 1.45674 может быть внутри кавычек, в этом случае это не проблема.

1 Ответ

0 голосов
/ 24 февраля 2019

Если вы используете JSON из стандартной библиотеки Ruby , следующее должно заставить Ruby использовать ваш класс:

  • Добавьте ключ json_class к объекту JSON с помощьюзначение имени вашего класса (например, '{"json_class":"Money::Ethereum","amount":1.45674}')
  • Добавьте в класс метод класса с именем json_create, который создает объект на основе данных JSON (например, new(json_data['amount']))
  • Когда вы выполняете синтаксический анализ, добавьте опцию «create_additions»: JSON.parse(json_string, create_additions: true)

Пример этого можно увидеть в расширении JSON для Range, который имеет метод класса json_create, а также методы экземпляра as_json и to_json, которые выводят значение, которое может быть возвращено в json_create.

require 'json/add/range'
output = (0..10).to_json
JSON.parse(output, create_additions: true) # Returns the range 0..10
...