2012-08-27 4 views
0

JSON 입력을 편집하고 POST를 통해 다른 시스템에 다시 제출해야하는 Java 프로그램을 작성 중입니다. 내 코드에서 새 비디오 유형으로 JSONArray를 업데이트하는 키 : 값 쌍이있는 HashMap을 사용합니다. 코드는 정상적으로 작동하지만 내 코드는 다른 순서로 출력됩니다. 왜 그런지 모르겠습니다. 내 자바 코드로 코드를 처리 할 때JSON 개체의 요소 정렬?

는 JSON 출력은 다음과 같습니다

{ 
    "TransformType": { 
     "processType": "encode", 
     "encodeOptions": [ 
      { 
       "types": [ 
        "MPEG" 
       ], 
       "title": "Convert to MPEG" 
      } 
     ] 
    } 
} 

내 코드는 매우 간단합니다 : 시스템이 기대

{ 
    "TransformType": { 
     "encodeOptions": [ 
      { 
       "types": [ 
        "MPEG" 
       ], 
       "title": "Convert to MPEG" 
      } 
     ], 
     "processType": "encode" 
    } 
} 

출력은 다음과 같습니다 :

HashMap<String,String> newTypesMap = new HashMap<String,String>(); 


    if (TransformTypeObj.has("encodeOptions")) { 

     JSONArray encodingOptionsArr = TransformTypeObj.getJSONArray("encodeOptions"); 

     for(int i = 0; i < encodingOptionsArr.length(); i++) { 

      JSONObject encodeOptObj = encodeOptionsArray.getJSONObject(i); 
      JSONArray typesArr = encodeOptObj.getJSONArray("types"); 

      for (int h = 0; h < typesArr.length(); h++) { 
        String oldtype = typesArr.getString(h).toString(); 
        String newType = newTypesMap.get(oldtype); 
        typesArr.put(h, newType); 
      } 
     } 
    } 

제 3 자 시스템을 편집하거나 볼 수는 없습니다. 중요하다. Java 출력을 '올바른'형식으로 편집하고 수동 게시물을 작성했으며 시스템에서이를 수용합니다. Java 코드 출력을 사용하려고하면 다음과 같은 오류 메시지가 나타납니다.

Java.lang.RuntimeException: com.jacksonmedia.data.api.marshalling.MarshallingException: array element type mismatch 

나는 개체의 순서와 관련이 있다고 생각합니다. 어떻게 'processType'JSONString을 TransformType 객체의 첫 번째 요소로 만들 수 있습니까 ??

+0

일부 관련 코드가 누락되었습니다. 이 코드는 내부의 ""encodeOptions "'배열을 작성하기위한 코드 일 뿐인 것처럼 보입니까? – pb2q

답변

1

json.org에서 JSONObject impl을 사용한다고 가정합니다. 안타깝게도 JSONObject는 내부 요소의 순서를 유지하지 않습니다 (내부적으로 HashMap을 사용합니다). 주문을 보존하는 다른 JSON 라이브러리를 찾을 수 있습니다. 또는 소스를 가져 와서 JSONObject를 변경하여 LinkedHashMap을 내부적으로 사용하고 대신 사용자 정의 구현을 사용할 수 있습니다.

3

HashMap 대신 LinkedHashMap을 사용하면 삽입 순서가 유지됩니다.

+0

문제는 JSONObject 내부에 있다고 생각합니다. OP 코드에 사용 된 HashMap이 아닙니다. – jtahlborn