0

我正在用 Java 编写一个程序,我需要在其中编辑 JSON 输入,然后通过 POST 将其重新提交到不同的系统。在我的代码中,我使用了一个具有键值对的 HashMap,在其中我将 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 对象中的第一个元素?

4

2 回答 2

3

而不是HashMap使用LinkedHashMapwhich 保留插入顺序。

于 2012-08-27T19:21:03.513 回答
1

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

于 2012-08-27T19:18:20.503 回答