2

Jersey 1.11を使用してリストにネストされたHashMapをJSONにマーシャリングしようとすると問題が発生します。

以下は、返された Response オブジェクトを介して MediaType.APPLICATION_JSON を生成する Jersey エンドポイントのスニペットです。

DataDTO.java

@XmlRootElement
public class DataDTO {
  ...
  private List<GenericEntity<HashMap<String, String>> dataHierarchy;

  public List<GenericEntity<HashMap<String, String>> getDataHierarchy() { return dataHierarchy; }
  public void setDataHierarchy(List<GenericEntity<HashMap<String, String>> dh) { dataHierarchy = dh; }
}

ジャージー リソース クラス:

@Get
@Produces(MediaType.APPLICATION_JSON)
@Path("/summary")
public Response getSummary() {
  ....
  DataDTO dto = new DataDTO();
  List<GenericEntity<HashMap<String,String>>> genericEntityList = new ArrayList<>();
  for (HashMap<String, String> hashMapEntity : summary.getDataHierarchy()) {
      GenericEntity<HashMap<String, String>> genericEntity = new GenericEntity<HashMap<String, String>>(hashMapEntity) {};
      genericEntityList.add(genericEntity);
  }
  dto.setDataHierarchy(genericEntityList);
  return Response.ok(dto).build();
}

DTO は「自然なクラス セット」の一部であり、その JAXBContext リゾルバー コンテキストは、次のように自然な表記法とルート アンラップを使用するように構成されています。

new JSONJAXBContext(JSONConfiguration.natural().rootUnwrapping(true).build(),
                    naturalClassSet.toArray(new Class[naturalClassSet.size()]));

たとえば、リストに 5 つのエントリがある場合、応答 JSON は次のようになります。

{"dataHierarychy":[null, null, null, null, null]}

また、DataDTO の dataHierarchy プロパティを変更して、各汎用データ構造が GenericEntity にラップされるようにしました。

private GenericEntity<List<GenericEntity<HashMap<String,String>>>>

これは単純に次のようになります。

{"dataHierarychy":null}
4

0 に答える 0