2016-03-25 23 views
2

私は、マーシャリング(Object - >JSON)とアンマーシャリング用のGSON(JSON - >Object)専用にJettisonを使用する環境(Java)で作業を開始しました。Jettison JSON形式を変更して外部オブジェクトラッパーを除外する方法は?

Jettisonマーシャラで作成されたJSONオブジェクトのアンマーシャリングに問題が発生しています。私は、クラスXのオブジェクトに対して、文字列を生成投棄が

{"X":{"prop1":"value1", "prop2":"value2"}} 

私はGSONと非マーシャルにそれをしようとすると、PROP1とPROP2の両方がNULL値を持っていることに気付きました。

生産JSON文字列投棄の形式を信頼していない、私は外JSONラッパーなしで文字列

​​

をデシリアライズしようとした、とGSONはそれを正しく処理しました。

外部ラッパーを取り付けずにJettisonにJSONを作成させる方法はありますか?あるいは、JettisonとGSONを連携させるための何か方法はありますか?

答えて

0

私はJettisonに詳しくはありませんが、GSONでこれを処理することは可能です。

まず第一に、我々は、要素のツリーにJSONを読み込むためにGSONのJsonParserを使用することができます。

String json = "{\"X\":{\"prop1\":\"value1\", \"prop2\":\"value2\"}}"; 
JsonParser parser = new JsonParser(); 
JsonElement element = parser.parse(json); 
JsonObject object = element.getAsJsonObject(); 

今、私たちは、このオブジェクトの「X」プロパティの値を抽出したいです。我々はプロパティの名前を知っている場合は、我々だけで使用することができます。

JsonElement value = object.get("X"); 

しかし、質問からそれは変えることができ、このプロパティの名前のように思えました。

Set<Map.Entry<String, JsonElement>> entrySet = object.entrySet(); 
Map.Entry<String, JsonElement> firstEntry = entrySet.iterator().next(); 
JsonElement value = firstEntry.getValue(); 

私たちは、この値を持っていたら、私たちはいつものように私たちのクラスのインスタンスにそれをデシリアライズすることができます:

Gson gson = new Gson(); 
X x = gson.fromJson(value, X.class); 
System.out.println(x.prop1); // prints value1 
System.out.println(x.prop2); // prints value2 
+0

この場合、我々はこのような例のために、動的に最初のプロパティを取得する必要がありますGSONを活用していただきありがとうございます。これは、Jettisonがjsonを変更する方法を提供していない場合、私たちが最終的に取り上げる可能性のある経路です。 – piper1970

+0

お寄せいただきありがとうございます。私の答えが役に立ったら、それを合格とマークしてください。 – andersschuller

+0

この問題を解決しましたか?私は同じことを実行しているとあなたが私を助けることができるかと思っていた。 –

関連する問題