Java/Groovy метод для строковых чисел в объекте?

Я читаю структуры данных из YAML с помощью Groovy и хочу преобразовать все числа на карте или в списке в строки.

Рассмотрим следующие данные в YAML:

young man:
  gender: male
  age: 18
  weight: 70
  height: 180
  currentHealth: 3
  smoker: no
  lackOfMobility: no
young woman:
  gender: female
  age: 19
  weight: 65
  height: 170
  currentHealth: 3
  smoker: no
  lackOfMobility: no

SnakeYAML преобразует это в многоуровневую карту (dict, hash), с young man а также young womanдве клавиши верхнего уровня на карте. Значения как age а также height хранятся в виде целых чисел, что обычно идеально.

Но дальше вниз по течению, в моем нынешнем проекте, age а также height должны быть строки, чтобы сохранить существующий микросервис счастливым.

Я хотел бы преобразовать все числа, как age, weight а также height в строки. И мне нужны многоуровневые карты и списки для правильной обработки.

Я не хочу помещать кавычки вокруг чисел, что будет одним из способов заставить YAML представлять их как строки.

Кто-то, возможно, уже решил эту проблему. Существуют ли надежные библиотечные методы, которые заботятся о строковых числах в объекте?

2 ответа

Решение

Вы можете настроить snakeyaml для лечения ints как strings изменяя constructor используемый.

import org.yaml.snakeyaml.Yaml
import org.yaml.snakeyaml.constructor.Constructor
import org.yaml.snakeyaml.nodes.Tag;

def input = '''
young man:
  gender: male
  age: 18
  weight: 70
  height: 180
  currentHealth: 3
  smoker: no
  lackOfMobility: no
young woman:
  gender: female
  age: 19
  weight: 65
  height: 170
  currentHealth: 3
  smoker: no
  lackOfMobility: no
'''

Constructor c = new Constructor()
c.yamlConstructors[Tag.INT] = c.yamlConstructors[Tag.STR]

Yaml yaml = new Yaml(c)
def d = yaml.load(input)

assert d."young man".age.getClass() == String

Это хорошо работает для рекурсивного List а также Map Типы, выводимые SnakeYAML:

static stringify(object) {
    def type = object.getClass().name
    if (type.endsWith('Map')) {
        def stringMap = new LinkedHashMap()
        object.each { k, v ->
            stringMap[k] = stringify(v)
        }
        return stringMap
    } else if (type.endsWith('List')) {
        def stringList = []
        object.each { v ->
            stringList.add(stringify(v))
        }
        return stringList
    } else {
        return object.toString()
    }
}
Другие вопросы по тегам