1

私は以下を持っていますJSON。そして、 Jacksonパーサーを使用して解析しています

 {
  "code": 0,
  "response": {
    "pagination": {
        "page": 1,
        "limit": 20,
        "count": 5,
        "pageCount": 1
    },
   "random": [
      ....
     ]
  }
}

これで、さまざまなオブジェクト用に作成された単純な POJO クラスができました。random3 ~ 4 種類の random オブジェクトを想定しています。そのため、さまざまなタイプの「ランダム」オブジェクトに対してさまざまなラッパー クラスを作成する代わりに、汎用のラッパー クラスを作成しました。

編集されたクラス:

public class PaginatedResponse<E> {

   private Pagination pagination;
   private List<E> responseList;

   public Pagination getPagination() {
       return pagination;
   }

   public void setPagination(Pagination pagination) {
       this.pagination = pagination;
   }

   public List<E> getResponseList() {
       return responseList;
   }

   public void setResponseList(List<E> responseList) {
       this.responseList = responseList;
   }
}

今それをマッピングするために私が使用した、

  JsonNode tree = mapper.readTree(response);
  TypeReference<PaginatedResponse<LocationParent>> ref = new TypeReference<PaginatedResponse<LocationParent>>() {   };
  PaginatedResponse<LocationParent> resp = mapper.convertValue(tree.get("response"), ref);

しかし、私はマップすることができませんresponseList pagination オブジェクトを取得しますが、responseList常に null です。を動的に提供する方法について説明しproperty nameますresponseList

助けてください

4

2 に答える 2

1

変数値型に必要なのは、多相型の処理です。逆シリアル化側ではどの型を使用するかがわからないため、ジェネリック型だけでは役に立ちません。

アノテーションを使用して多相型の処理を有効にすることができ@JsonTypeInfoます。しかし、この特定のケースの問題はList、任意の型のものを必要とすることですList<Object>。要素の入力はありません。

それが私だったら、おそらくサブクラス化して、次のように基本クラスにPaginatedResponse追加します。@JsonTypeInfo

@JsonTypeInfo(...) // see javadocs for properties needed
public abstract class PaginatedResponse<T> {
  public Pagination pagination;
  // .. and so on
}

public class PaginatedFooResponse<Foo> { }

ここでサブクラス化を使用する理由は、応答オブジェクトの型が与えられたときに、デシリアライザーが要素の型を把握できるようにするためです。応答オブジェクトは型 ( PaginatedFooResposne) を持ち、その型から要素を利用できます。

于 2012-12-05T00:12:18.280 に答える
0

これを試して::

JSONObject objJSON = JSONObject.fromString("urString");

String code = objJSON.get("code");
于 2012-11-30T13:47:02.493 に答える