1

将 JSON 提要转换为我们的 Endeca 实例可以使用的格式,并决定在 Groovy 中编写这种转换,这要归功于 JsonSlurper 和 MarkupBuilder 等工具。我们的 JSON 提要输入如下所示(保存为 stage/newObject.json):

[
  {
    "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())
        }
    }
}
4

1 回答 1

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)
                    }
                }
            }
        }
    }
}
于 2014-06-06T19:53:25.833 回答