我正在使用Groovy从YAML读取数据结构,并希望将地图或列表中的所有数字转换为字符串。
考虑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将此转换为多级Map(dict,hash),其中young man
和young woman
是地图中的两个顶级键。像age
和height
这样的值存储为整数,这通常是理想的。
但在下游,在我目前的项目中,age
和height
需要成为字符串,以保持预先存在的微服务。
我希望将age
,weight
和height
等所有数字转换为字符串。我需要正确处理多级地图和列表。
我不想在数字周围加上引号,这将迫使YAML将它们表示为字符串。
有人可能已经解决了这个问题。是否有任何强大的库方法来处理对象中的数字字符串?
答案 0 :(得分:2)
您可以通过更改使用的ints
将snakeyaml配置为将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
答案 1 :(得分:0)
这适用于SnakeYAML输出的递归List
和Map
类型:
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()
}
}