2016-08-31 27 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在地圖中的兩個頂級密鑰。像ageheight這樣的值被存儲爲整數,這通常是理想的。

但在更遠的下游,在我目前的項目中,ageheight需要是字符串以保持預先存在的微服務的快樂。

我想將所有數字如age,weightheight轉換爲字符串。我需要多級地圖和列表才能正確處理。

我不想在數字周圍加上引號,這會強制YAML將它們表示爲字符串。

有人可能已經解決了這個問題。有沒有強大的庫方法來處理對象中的字符串數字?

回答

2

您可以配置snakeyaml通過改變所使用的constructor治療intsstrings

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

這一直運作良好的遞歸ListMap類型的輸出由SnakeYAML:

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() 
    } 
} 
相關問題