2014-06-06 1 views
1

Endeca 인스턴스에서 사용할 수있는 형식으로 JSON 피드를 변환하고 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 변수를 참조로 전달하며 문자열로 처리되지 않습니다. 하지만 문자 배열은 출력을 시도하기 때문에 String이 아닌 Memory 위치를 얻습니다. 우리가 지금까지있어 해결 방법은 이것이다,하지만 난 더 우아한 해결책이 있다면 알고 싶어 :이 논리는 다음과 같이 간단하게 할 수 있지만

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

에서 subField in field.value

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.value

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) 
        } 
       } 
      } 
     } 
    } 
}