0

私はJavaでプログラムを作成しています。このプログラムでは、JSON入力を編集してから、POSTを介して別のシステムに再送信する必要があります。私のコードでは、JSONArrayを新しいビデオタイプに更新するkey:valueペアを持つHas​​hMapを使用しています。コードは正常に機能しているように見えますが、私のコードは異なる順序を出力し、その理由はわかりません。

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使用の代わりに。LinkedHashMap

于 2012-08-27T19:21:03.513 に答える
1

json.org の JSONObject impl を使用していると思います。残念ながら、JSONObject は内部要素の順序を保持しません (内部で HashMap を使用します)。順序を保持する別の JSON ライブラリを見つけることができます。または、ソースを取得し、JSONObject を変更して LinkedHashMap を内部で使用し、代わりにカスタム実装を使用することもできます。

于 2012-08-27T19:18:20.503 に答える