Java/Groovy 将对象中的数字字符串化的方法?
Java/Groovy method for stringifying numbers in an object?
我正在使用 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 将它们表示为字符串的一种方式。
有人可能已经解决了这个问题。是否有任何健壮的库方法可以处理对象中数字的字符串化?
这对于 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()
}
}
您可以配置 snakeyaml 通过更改使用的 constructor
将 ints
视为 strings
。
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
我正在使用 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 将它们表示为字符串的一种方式。
有人可能已经解决了这个问题。是否有任何健壮的库方法可以处理对象中数字的字符串化?
这对于 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()
}
}
您可以配置 snakeyaml 通过更改使用的 constructor
将 ints
视为 strings
。
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