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()
}
}