17

次のように Java で実装されたパラメーター化されたツリーがあるとします。

public class Tree<E> {
   private static class Node {
      E element;
      List<Node> children.
   }

   Node root;

   //... You get the idea.
}

ここでの考え方は、上記の実装はツリーのトポロジのみに関係しており、インスタンス化によってツリーに格納される要素については何も知らないということです。

ここで、ツリー要素を地理にしたいとします。それらがツリーで編成されている理由は、大陸には国が含まれ、国には州または州が含まれるなどの理由があります。簡単にするために、地理には名前とタイプがあります。

public class GeoElement { String name; String type; }

最終的に、地理階層は次のようになります。

public class Geography extends Tree<GeoElement> {}

ではジャクソン連載へ。Jackson シリアライザーがフィールドを認識できると仮定すると、この実装の直接シリアライズは次のようになります。

{
   "root": {
      "element": {
         "name":"Latin America",
         "type":"Continent"
      }
      "children": [
          {
             "element": {
                "name":"Brazil",
                "type":"Country"
             },
             "children": [
                 // ... A list of states in Brazil
             ]
          },
          {
             "element": {
                "name":"Argentina",
                "type":"Country"
             },
             "children": [
                 // ... A list of states in Argentina
             ]
          }
      ]
   }

この JSON レンダリングは、Tree および Node クラスからの不要なアーティファクト、つまり「ルート」と「要素」が含まれているため、適切ではありません。代わりに必要なのはこれです:

{
   "name":"Latin America",
   "type":"Continent"
   "children": [
       {
          "name":"Brazil",
          "type":"Country"
          "children": [
             // ... A list of states in Brazil
          ]
       },
       {
          "name":"Argentina",
          "type":"Country"
          "children": [
             // ... A list of states in Argentina
          ]
       }
   ]
}

どんな助けでも大歓迎です。-イゴール。

4

4 に答える 4

9

必要なのは@JsonUnwrapped.

プロパティを「アンラップ」してシリアル化する必要があることを示すために使用される注釈。つまり、JSON オブジェクトとしてシリアル化される場合、そのプロパティは代わりに、それを含むオブジェクトのプロパティとして含まれます。

次のように、この注釈をクラスの&フィールドのrootフィールドに追加します。TreeelementNode

public class Tree<E> {
   private static class Node {

      @JsonUnwrapped
      E element;
      List<Node> children.
   }

   @JsonUnwrapped
   Node root;

   //... You get the idea.
}

そして、それはあなたが望む出力を提供します:

{
    "name": "Latin America",
    "type": "Continent",
    "children": [{
        "name": "Brazil",
        "type": "Country",
        "children": []
    }, {
        "name": "Argentina",
        "type": "Country",
        "children": []
    }]
}
于 2018-07-28T14:11:59.313 に答える
5

おそらく@JsonValue次のように使用します。

public class Tree<E> {
  @JsonValue
  Node root;
}

必要なのは、ツリーを「アンラップ」することだけですか?

于 2013-01-29T05:53:13.137 に答える
-2

タイプを削除するためのelement1つの可能性は、名前とタイプが各ノードに直接含まれるように構造を変更することです。

public class TreeGeo {
   private static class Node {
      String name;
      String type;
      List<Node> children.
   }

   Node root;
}

タイプを削除するためrootに、私は知りません。jsonObjectからサブオブジェクトを抽出できると思いますが、Jacksonについてはよくわかりません。ただし、結果の文字列のようなより適切な名前を付けるか、world文字列を操作して手動で削除することができます。

于 2013-01-29T09:41:09.310 に答える