2016-05-24 7 views
1

jsonの文字列をgensonでjavaオブジェクトに逆シリアル化しようとしていますが、成功できませんでした。あなたはComplexConditionleftrightの両方のためにそのメンバーとして別のComplexConditionまたはSimpleConditionを有していてもよく見ることができるように多面体メンバでJson to Javaを非直列化

public class Condition { 
} 

public class SimpleCondition extends Condition { 
    String feature; 
    String op; 
    String value; 
    int primitive; 
} 

public class ComplexCondition extends Condition { 
    private Condition left; 
    private String joint; 
    private Condition right; 
} 

:私のクラス構造は、このようなものです。私が手JSONはこのようなものです:このJSONで

{ 
    "left": { 
      "feature":"locality", 
      "op":"==", 
      "value":"Chino" 
      "primitive":9, 
      }, 
    "joint":"and", 
    "right": { 
       "feature":"ch4", 
       "op":">=", 
       "value":"1.5", 
       "primitive":3 
      } 
} 

ComplexConditionSimpleConditionのようleftrightの両方を持っています。しかし、私が受け取る一般的なjson文字列は、SimpleConditionからComplexConditionの任意のネストレベルまでの範囲のものです。私はjsonの文字列に@classの値を設定しようとしましたが、まだgensonはそれを逆シリアル化できませんでした。任意のライブラリを使用してjavaにこのjsonをデシリアライズする際の助けに感謝します。

+0

使用するライブラリのJavaクラス名に関するデータがないため、提供されたjsonを任意の汎用ライブラリによって提供されたJavaオブジェクトに逆シリアル化することはできません。おそらくあなたはあなた自身の非直列化を書く必要があります –

+0

あなたの時間のための@Lashane。私はJSONオブジェクトを受け入れる 'SimpleCondition'と' ComplexCondition'の両方でコンストラクタを持つことによって自分自身を逆シリアル化しました。その中のオブジェクトプロパティに基づいて 'ComplexCondition'で再帰呼び出しを行っています。 –

答えて

1

あなたのクラスのためにいくつかのエイリアスを登録してから、このようなあなたのJSONでそれらを参照することができます。

Genson genson = new GensonBuilder() 
    .addAlias("ComplexCondition", ComplexCondition.class) 
    .addAlias("SimpleCondition", SimpleCondition.class) 
    .create(); 

{ 
    "@class": "ComplexCondition", 
    "left": { 
      "@class": "SimpleCondition", 
      "feature":"locality", 
      "op":"==", 
      "value":"Chino", 
      "primitive":9 
      }, 
    "joint":"and", 
    "right": { 
      "@class": "SimpleCondition", 
       "feature":"ch4", 
       "op":">=", 
       "value":"1.5", 
       "primitive":3 
      } 
} 
あなたはまた、あなたのComplexConditionのためのgetおよびsetメソッドを追加したり、そのフィールドを公開する必要があります

それらを引数として取るか、gensonを構成してプライベートフィールドを使用するコンストラクタを提供します。

最後に、@が前に付いていない属性の前にclassメタデータ属性を定義する必要があります。このjsonをGensonで生成すると、この制約は常に遵守されます。

+0

私は質問を投稿する前にそれを試みたが、うまくいかなかった。 'Condition'クラスを初期化しますが、何も設定しません。だから、 'Simple'か' Complex'のどちらかにキャストしようとすると、私は 'ClassCastException'を取得します。一度それを確認していただけますか? –

+0

おそらく、ComplexConditionの属性がすべてプライベートであり、取得/設定機能がないためです。私はちょうどそれらのgetメソッドとsetメソッドを生成してみると、すべて正常に動作します。ところで、jsonにタイプミスがあり無効になっています。私は修正されたjsonで答えを更新しました – eugen

+0

私はすべてのゲッターとセッターを持っていますが、私はその質問でそれらを無視しました。実際には 'Simple'と' Complex'の両方のクラスで 'toString()'メソッドを使っています。あなたのjsonの結果は '([email protected] and [email protected])'です。私が期待しているのはこれです - '((locality == Chino)と(ch4> = 1.5)) 'である。 –

0

私はこの解決策を考え出しました。誰かがより良い解決策を与えることができれば、私はそれを受け入れてうれしいです。

import org.json.JSONObject; 
public class Condition { 
    public static Condition getCondition(JSONObject json){ 
     if(json.has("left")) 
      return new ComplexCondition(json); 
     else if(json.has("feature")) 
      return new SimpleCondition(json); 
     else 
      throw new IllegalArgumentException("Invalid json for a Condition"); 
    } 
} 

public class ComplexCondition extends Condition{ 
    private Condition left; 
    private String joint; 
    private Condition right; 

    public ComplexCondition(JSONObject json){ 
     if(json.has("left")){ 
      JSONObject leftJSON = json.getJSONObject("left"); 
      if(leftJSON.has("left")) 
       this.left = new ComplexCondition(leftJSON); 
      else 
       this.left = new SimpleCondition(leftJSON); 

      this.joint = json.getString("joint"); 

      JSONObject rightJSON = json.getJSONObject("right"); 
      if(rightJSON.has("left")) 
       this.right = new ComplexCondition(rightJSON); 
      else 
       this.right = new SimpleCondition(rightJSON); 
     } else { 
      throw new IllegalArgumentException("invalid json for a complex condition"); 
     } 
    } 

    //getters and setters 
} 

public class SimpleCondition extends Condition{ 
    private String feature; 
    private String op; 
    private String value; 
    private int primitive; 

    public SimpleCondition(JSONObject json) { 
     if(json.has("feature")){ 
      this.feature = json.getString("feature"); 
      this.op = json.getString("op"); 
      this.value = json.getString("value"); 
      this.primitive = json.getInt("primitive"); 
     } else 
      throw new IllegalArgumentException("invalid json for a simple condition"); 

    } 

    //getters and setters 
} 
関連する問題