2012-08-27 99 views
0

我正在編寫一個Java程序,我需要編輯一個JSON輸入,然後通過POST重新提交給另一個系統。在我的代碼中,我使用了一個HashMap,它有一個key:value對,其中我將JSONArray更新爲新的視頻類型。代碼似乎工作正常,但我的代碼輸出不同的順序,我不知道爲什麼。在JSON對象中排列元素?

當我與我的Java代碼處理代碼的JSON輸出看起來是這樣的:

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

該系統期待的輸出結果如下:

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

我的代碼很簡單:

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

我無法編輯或看到此第三方系統,但顯然是命令很重要。我將我的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