2017-03-14 13 views
2

以下のコードを使用して、jsonを異なるJSON構造の複数のXMLファイルに変換します。シーケンスを変更せずにJSONからXMLへの変換

String toXmlRequest = fullRequest.toString();    
JSONObject jsonObj = new JSONObject(toXmlRequest);    
String XmlRequest = XML.toString(jsonObj); 
System.out.println(XmlRequest); 

入力

 { 
     "EnrollmentRequest": 
     { 
      "data": 
      { 
       "commonDataContext": 
        { 
         "requestId": "ADA12131", 
         "clientId": "ABCDEF", 
         "timestamp":"2013-12-13T11:10:00.715-05:00" 
        }, 
       "cardNumber" : "123456789" , 
       "firstName" : "John" , 
       "lastName" : "Smith" , 
       "email" : "[email protected]" , 
       "enrollStatus" : "E" , 
       "pathEnroll" : "NewAcct", 
       "cardSavedIndicator" : "Y" 
      } 
     } 
    } 

出力

 <EnrollmentRequest> 
      <data> 
       <firstName>John</firstName> 
       <lastName>Smith</lastName> 
       <commonDataContext> 
        <clientId>ABCDEF</clientId> 
        <requestId>ADA12131</requestId> 
        <timestamp>2013-12-13T11:10:00.715-05:00</timestamp> 
       </commonDataContext> 
       <pathEnroll>NewAcct</pathEnroll> 
       <enrollStatus>E</enrollStatus> 
       <cardSavedIndicator>Y</cardSavedIndicator> 
       <cardNumber>123456789</cardNumber> 
       <email>[email protected]</email> 
      </data> 
     </EnrollmentRequest> 

出力の配列が変化しつつあります。実際のシーケンスを保持することはできません。これをそのまま維持できる方法はありますか?

+0

? – Adam

+1

なぜ同じ順序で保管する必要がありますか? –

答えて

1

org.json.JSONObjectを直接使用することはできません。その理由は、JSONObjectがHashMap型の内部ストアを使用するからです。 HashMapは挿入順序を保持しません

LinkedHashMapでも可能ですが、JSONObjectを使用するように設定することはできません。

/** 
* Construct an empty JSONObject. 
*/ 
public JSONObject() { 
    this.map = new HashMap<String, Object>(); 
} 

代わりに、順序を保持するライブラリを使用して読み取ることもできます。ジャクソン....

ObjectMapper mapper = new ObjectMapper(); 
JsonNode jackson = mapper.readTree(fullRequest); 

、その後ジャクソンのオブジェクトはorg.json.JSONObjectのように見えるようにするために必要なタイプの適応をXMLに

String xmlRequest = XML.toString(new JSONAdapter(jackson)); 

をそのを養います。不完全な例以下:あなたはJSONライブラリを使用している

private static class JSONAdapter extends JSONObject { 

    private JsonNode jackson; 

    public JSONAdapter(JsonNode jackson) { 
     this.jackson = jackson; 
    } 

    @Override 
    public Iterator<String> keys() { 
     return jackson.fieldNames(); 
    } 

    @Override 
    public Object opt(String key) { 
     return get(key); 
    } 

    @Override 
    public Object get(String key) throws JSONException { 
     JsonNode nested = jackson.get(key); 
     if (nested.isObject()) { 
      return new JSONAdapter(nested); 
     } else if (nested.isTextual()) { 
      return nested.asText(); 
     } else if (nested.isNumber()) { 
      return nested.asDouble(); 
     } else if (nested.isBoolean()) { 
      return nested.asBoolean(); 
     } 
     return null; 
    } 

} 

出力

<EnrollmentRequest> 
    <data> 
     <commonDataContext> 
      <requestId>ADA12131</requestId> 
      <clientId>ABCDEF</clientId> 
      <timestamp>2013-12-13T11:10:00.715-05:00</timestamp> 
     </commonDataContext> 
     <cardNumber>123456789</cardNumber> 
     <firstName>John</firstName> 
     <lastName>Smith</lastName> 
     <email>[email protected]</email> 
     <enrollStatus>E</enrollStatus> 
     <pathEnroll>NewAcct</pathEnroll> 
     <cardSavedIndicator>Y</cardSavedIndicator> 
    </data> 
</EnrollmentRequest> 
+0

ありがとう、これは..それは働いた。 :) –