2014-06-06 41 views
1

将JSON提要转换为可由我们的Endeca实例使用的格式,并由于诸如JsonSlurper和MarkupBuilder等工具而在Groovy中编写此转换。我们的JSON饲料投入看起来像这样(保存为舞台/ newObject.json):Groovy MarkupBuilder通过引用传递字符串

[ 
    { 
    "Name": "Object Name", 
    "DimID": 0000, 
    "ObjectID": "Object-0000", 
    "TypeID": 1, 
    "Type": "Object Type", 
    "Description": "A Description", 
    "DirectorID": "007", 
    "DirectorName": "Bond, James", 
    "ParentObjectID": null, 
    "ObjectLevelID": 1, 
    "ObjectLevel": "MI-6", 
    "ProjectNumbers": [ 
     "0001", 
     "0002" 
    ], 
    "ManagerIDs": [ 
     "001" 
    ], 
    "ManagerNames": [ 
     "M" 
    ], 
    "SubObjectIDs": [ 
     "006", 
     "005" 
    ], 
    "TaskNumbers": [ 
     "001" 
    ], 
    "ProjectNames": [ 
     "Casino Royal", 
     "Goldfinger", 
     "License to Kill" 
    ] 
    } 
] 

而且我必须做转换的代码是这样的:

def rawJSONFile = new File("stage/newObject.json") 
JsonSlurper slurper = new JsonSlurper() 
def slurpedJSON = slurper.parseText(rawJSONFile.text) 

def xmlOutput = new MarkupBuilder(new FileWriter(new File("stage/ProcessedOutput.xml"))) 

xmlOutput.RECORDS() { 
    for (object in slurpedJSON) { 
     RECORD() { 
      for (field in object) { 
       if (field.value != null) { 
        if (field.value.value.class.equals(java.util.ArrayList)) { 
         if (field.value.value.size > 0) { 
          for (subField in field.value.value) { 
           if (subField != null) { 
            PROP(NAME: field.key) { 
             PVAL(subField) 
            } 
           } 
          } 
         } 
        } else { 
         PROP(NAME: field.key) { 
          PVAL(field.value) 
         } 
        } 
       } 
      } 
     } 
    } 
} 

我们的问题体验大约是groovy脚本的一半,它处理子字段(即JSON中的数组),创建“PVAL”节点的闭包通过引用传递subField变量,并且它不被视为字符串但一个字符数组,所以试图做输出,我们得到一个内存位置,而不是一个字符串。到目前为止,我们已经有了解决办法是这样的,但我想知道是否有一个更优雅的解决方案:

for (subField in field.value.value) { 
    if (subField != null) { 
     PROP(NAME: field.key) { 
      StringBuilder subFieldValue = new StringBuilder(); 
      for(int i =0; i<subField.length; i++){ 
       subFieldValue.append(subField[i]) 
      } 
      PVAL(subFieldValue.toString()) 
     } 
    } 
} 

回答

2

变化subField in field.value.valuesubField in field.value

for (subField in field.value) { 
    if (subField != null) { 
     PROP(NAME: field.key) { 
      PVAL(subField) 
     } 
    } 
} 

虽然这个逻辑可以简化为

xmlOutput.RECORDS { 
    slurpedJSON.each { map -> 
     Record { 
      map.each { k, v -> 
       if (v in ArrayList) { 
        v.each { val -> 
         PROP(NAME: k) { 
          PVAL(val) 
         } 
        } 
       } else { 
        PROP(NAME: k) { 
         PVAL(v) 
        } 
       } 
      } 
     } 
    } 
} 
相关问题