用于在对象中对数字进行字符串化的Java / Groovy方法?

时间:2016-08-31 04:21:31

标签: string groovy casting numbers snakeyaml

我正在使用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将它们表示为字符串。

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

2 个答案:

答案 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输出的递归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()
    }
}