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 manyoung woman 是映射中的两个顶级键。 ageheight 等值存储为整数,这通常是理想的。

但在更下游,在我目前的项目中,ageheight 需要是字符串才能使预先存在的微服务保持快乐。

我想将所有数字如 ageweightheight 转换为字符串。我需要正确处理多级地图和列表。

我不想在数字周围加上引号,这是强制 YAML 将它们表示为字符串的一种方式。

有人可能已经解决了这个问题。是否有任何健壮的库方法可以处理对象中数字的字符串化?

这对于 SnakeYAML 输出的递归 ListMap 类型非常有效:

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 通过更改使用的 constructorints 视为 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