2017-01-25 8 views
0

おはようございます。 リスト(<)にあるオブジェクトのプロパティとプロパティ名を別のオブジェクト(プロパティとして)から返すと、 。jackson json list-of-listの特定のプロパティ値をシリアライズ

私は次のクラスがあります。

public class Base { 
    protected String type; 

    public String getType() { 
     return type; 
    } 

    public void setType(String type) { 
     this.type = type; 
    } 
} 

public class A extends Base { 
    private double[] value; 

    public A() { type = "A"; } 

    public A(double[] value) { 
     this(); 
     setValue(value); 
    } 

    public double[] getValue() { 
     return value; 
    } 

    public void setValue(double[] value) { 
     this.value = value; 
    } 
} 

public class B extends Base { 
    private List<A> value = new ArrayList<A>(); 

    public B() { type = "B"; } 

    public B(List<A> value) { 
     this(); 
     setValue(value); 
    } 

    public List<A> getValue() { return value; } 

    public void setValue(List<A> value) { 
     this.value = value; 
    } 
} 

public class C extends Base { 
    private List<B> value = new ArrayList<B>(); 

    public C() { type = "C"; } 

    public List<B> getValue() { 
     return value; 
    } 

    public void setValue(List<B> value) { 
     this.value = value; 
    } 
} 

などにそれらを使用する:

私が得る
A a = new A(); 
a.setValue(new double[]{1,2}); 

B b = new B(); 
List<A> aList = new ArrayList<A>(); 
aList.add(new A(new double[]{1,2})); 
aList.add(new A(new double[]{3,4})); 
b.setValue(aList); 

C c = new C(); 
List<B> bList = new ArrayList<B>(); 
List<A> aList1 = new ArrayList<A>(); 
List<A> aList2 = new ArrayList<A>(); 
aList1.add(new A(new double[]{1,2})); 
aList1.add(new A(new double[]{3,4})); 
aList2.add(new A(new double[]{5,6})); 
bList.add(new B(aList1)); 
bList.add(new B(aList2)); 
c.setValue(bList); 

ObjectMapper jsonMapper = new ObjectMapper(); 
jsonMapper.enable(SerializationFeature.INDENT_OUTPUT); 

try { 
    System.out.println("=== com.example.A ==="); 
    System.out.println(jsonMapper.writeValueAsString(a)); 

    System.out.println("=== com.example.B ==="); 
    System.out.println(jsonMapper.writeValueAsString(b)); 

    System.out.println("=== com.example.C ==="); 
    System.out.println(jsonMapper.writeValueAsString(c)); 
} catch (JsonProcessingException e) { 
    e.printStackTrace(); 
} 

=== com.example.A === 
{ 
    "type" : "A", 
    "value" : [ 1.0, 2.0 ] 
} 
=== com.example.B === 
{ 
    "type" : "B", 
    "value" : [ { 
    "type" : "A", 
    "value" : [ 1.0, 2.0 ] 
    }, { 
    "type" : "A", 
    "value" : [ 3.0, 4.0 ] 
    } ] 
} 
=== com.example.C === 
{ 
    "type" : "C", 
    "value" : [ { 
    "type" : "B", 
    "value" : [ { 
     "type" : "A", 
     "value" : [ 1.0, 2.0 ] 
    }, { 
     "type" : "A", 
     "value" : [ 3.0, 4.0 ] 
    } ] 
    }, { 
    "type" : "B", 
    "value" : [ { 
     "type" : "A", 
     "value" : [ 5.0, 6.0 ] 
    } ] 
    } ] 
} 

をしかし、私はそれが好きにしたい:

=== com.example.A === 
{ 
    "type" : "A", 
    "value" : [ 1.0, 2.0 ] 
} 
=== com.example.B === 
{ 
    "type" : "B", 
    "value" : [ [ 1.0, 2.0 ], [ 3.0, 4.0 ] ] 
} 
=== com.example.C === 
{ 
    "type" : "C", 
    "value" : [ [ [ 1.0, 2.0 ], [ 3.0, 4.0 ] ], [ [ 5.0, 6.0 ] ] ] 
} 

私はCからBのBとプロパティ「タイプ」から返されたときに使用してAのプロパティ「タイプ」を削除することができた:

@JsonIgnoreProperties({ "type" }) 
    public List<A> getValue() { 
     return value; 
    } 
... 
    @JsonIgnoreProperties({ "type" }) 
    public List<B> getValue() { 
     return value; 
    } 

をしかし、私はまだプロパティ「値」の名前を取得しています中括弧...

=== com.example.A === 
{ 
    "type" : "A", 
    "value" : [ 1.0, 2.0 ] 
} 
=== com.example.B === 
{ 
    "type" : "B", 
    "value" : [ { 
    "value" : [ 1.0, 2.0 ] 
    }, { 
    "value" : [ 3.0, 4.0 ] 
    } ] 
} 
=== com.example.C === 
{ 
    "type" : "C", 
    "value" : [ { 
    "value" : [ { 
     "value" : [ 1.0, 2.0 ] 
    }, { 
     "value" : [ 3.0, 4.0 ] 
    } ] 
    }, { 
    "value" : [ { 
     "value" : [ 5.0, 6.0 ] 
    } ] 
    } ] 
} 

目的の出力を得るために使用できる注釈は何ですか?それとも、クラスを再設計しなければならないのですか?

答えて

0
public class A extends Base { 
    private double[] value; 

    public A() { 
     type = "A"; 
    } 

    public A(double[] value) { 
     this(); 
     setValue(value); 
    } 

    public double[] getValue() { 
     return value; 
    } 

    public void setValue(double[] value) { 
     this.value = value; 
    } 
} 

public class B extends Base { 

    private List<A> value = new ArrayList<A>(); 

    public B() { 
     type = "B"; 
    } 

    public B(List<A> value) { 
     this(); 
     setValue(value); 
    } 

    @JsonIgnoreProperties({"type"}) 
    public List<A> getValue() { 
     return value; 
    } 

    @JsonGetter("value") 
    @JsonIgnoreProperties({"type"}) 
    public List<double[]> getA() { 
     List<double[]> res = new ArrayList<>(); 
     for (A a : value) { 
      res.add(a.getValue()); 
     } 
     return res; 
    } 

    public void setValue(List<A> value) { 
     this.value = value; 
    } 

    @Override 
    public String toString() { 
     return "" + value; 
    } 
} 

public class C extends Base { 
    private List<B> value = new ArrayList<B>(); 

    public C() { 
     type = "C"; 
    } 

    @JsonGetter("value") 
    @JsonIgnoreProperties({"type"}) 
    public List<List<double[]>> getB() { 
     List<List<double[]>> res1 = new ArrayList<>();    
     for (B b : value) { 
      List<double[]> res2 = new ArrayList<>(); 
      for (A a : b.getValue()) { 
       res2.add(a.getValue()); 
      } 
      res1.add(res2); 
     } 
     return res1; 
    } 

    public List<B> getValue() { 
     return value; 
    } 

    public void setValue(List<B> value) { 
     this.value = value; 
    } 
} 
+0

こんにちは、ありがとう、有望ですが、BとCの値は文字列になります( ""で囲みます) { "type": "B"、 "value": "[[3.0,4.0]、[5.0 6.0]」 } { "タイプ": "C"、 "値": "[[[7.0、8.0]、[9.0、10.0]、[11.0、12.0]]]" } –

+0

こんにちは、ありがとう。これは仕事です。 –

0

以下のようにBとCクラスを変更します

追加さ@JsonIgnore印刷し、その出力クラスAの値を持つ深い解析された結果である戻り型List<double[]>と新しい方法getValueForJson()が作成される値を回避する値に注釈。この新しいメソッドには、の値を"value"として追加し、これをvalueという名前のメンバーとして扱うようにします。

class B extends Base { 
    @JsonIgnore 
    private List<A> value = new ArrayList<A>(); 

    public B() { 
     type = "B"; 
    } 

    public B(List<A> value) { 
     this(); 
     setValue(value); 
    } 

    public List<A> getValue() { 
     return value; 
    } 

    public void setValue(List<A> value) { 
     this.value = value; 
    } 

    @JsonProperty("value") 
    public List<double[]> getValueForJson(){ 
     List<double[]> res = new ArrayList<double[]>(); 
     value.forEach(a -> res.add(a.getValue())); 
     return res; 
    } 
} 

class C extends Base { 
    @JsonIgnore 
    private List<B> value = new ArrayList<B>(); 

    public C() { 
     type = "C"; 
    } 

    public List<B> getValue() { 
     return value; 
    } 

    public void setValue(List<B> value) { 
     this.value = value; 
    } 

    @JsonProperty("value") 
    public List<double[]> getValueForJson(){ 
     List<double[]> res = new ArrayList<double[]>(); 
     value.forEach(b -> b.getValue().forEach(a -> res.add(a.getValue()))); 
     return res; 
    } 
} 
+0

こんにちはPavanクマー、おかげで、それは結果を取得しています。より効率的な方法があるかどうか尋ねたいだけでしたか? getValueForJsonで新しいArrayListを作成せずに? –

+0

こんにちはルイス、あなたはCの出力について確かですか?それは希望と同じではありません、ブレースの問題。 – mhshimul

+0

ああ、グループ分けはCと同じではありません。申し訳ありません。 –

関連する問題