我正在用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对象中的第一个元素?
答案 0 :(得分:3)
而不是HashMap
使用保留广告订单的LinkedHashMap
。
答案 1 :(得分:1)
我假设你正在使用json.org的JSONObject impl。遗憾的是,JSONObject不保留内部元素的顺序(它在内部使用HashMap)。您可以找到另一个保留订单的JSON库。或者,您可以获取源并更改JSONObject以在内部使用LinkedHashMap并改为使用您的自定义实现。