1

JsonSlurperやMarkupBuilderなどのツールを使用して、JSONフィードをEndecaインスタンスで使用できる形式に変換し、この変換をGroovyで記述することにしました。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)
                        }
                    }
                }
            }
        }
    }
}

私たちが経験している問題は、サブ フィールド (つまり、JSON 内の配列) を処理している groovy スクリプトの約半分にあり、「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.value_subField 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 に答える