首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MarkupBuilder通过引用传递字符串

MarkupBuilder通过引用传递字符串
EN

Stack Overflow用户
提问于 2014-06-06 19:30:11
回答 1查看 476关注 0票数 1

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

代码语言:javascript
复制
[
  {
    "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"
    ]
  }
]

我要做的转换代码是:

代码语言:javascript
复制
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变量,它不是作为字符串处理,而是作为字符数组处理,因此尝试执行输出时,我们得到一个内存位置,而不是字符串。到目前为止,我们找到的解决办法是这样的,但我想知道是否有一个更优雅的解决方案:

代码语言:javascript
复制
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())
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-06 19:53:25

subField in field.value.value更改为subField in field.value

代码语言:javascript
复制
for (subField in field.value) {
    if (subField != null) {
        PROP(NAME: field.key) {
            PVAL(subField)
        }
    }
}

虽然这个逻辑可以简化为

代码语言:javascript
复制
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)
                    }
                }
            }
        }
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24089332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档