在JSON对象中排列元素?

时间:2012-08-27 19:12:34

标签: java json

我正在用Java编写一个程序,我需要编辑一个JSON输入,然后通过POST重新提交给另一个系统。在我的代码中,我使用了一个HashMap,它有一个key:value对,我将JSONArray更新为新的视频类型。代码似乎工作正常,但我的代码输出不同的顺序,我不知道为什么。

当我使用我的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对象中的第一个元素?

2 个答案:

答案 0 :(得分:3)

而不是HashMap使用保留广告订单的LinkedHashMap

答案 1 :(得分:1)

我假设你正在使用json.org的JSONObject impl。遗憾的是,JSONObject不保留内部元素的顺序(它在内部使用HashMap)。您可以找到另一个保留订单的JSON库。或者,您可以获取源并更改JSONObject以在内部使用LinkedHashMap并改为使用您的自定义实现。