2016-08-31 2 views
0

私はGroovyを使ってYAMLからデータ構造を読み込み、マップやリストのすべての数値を文字列に変換したいと考えています。オブジェクト内の数値を文字列化するためのJava/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マップ内young manyoung woman 2つのトップレベルの鍵と、マルチレベルマップ(辞書、ハッシュ)にこれを変換します。 ageheightのような値は整数として格納されますが、これは通常は理想的です。

私の現在のプロジェクトでは、さらに下流のageheightは、既存のマイクロサービスを幸せに保つために文字列である必要があります。

私は文字列にageweightheightなどのすべてのnumericalsを変換したいと思います。そして、私はマルチレベルマップとリストが正しく処理される必要があります。

数字の前後に引用符を付けることは望ましくありません。これは、YAMLにそれらを文字列として表す1つの方法です。

誰かがすでにこの問題を解決している可能性があります。オブジェクトの文字列を扱う堅牢なライブラリメソッドはありますか?

答えて

2

あなたが使用constructorを変更することにより、stringsとしてintsを治療するためのsnakeyamlを設定することができます。

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 
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() 
    } 
} 
関連する問題