尝试使用 Jersey 1.11 将嵌套在 List 中的 HashMap 编组为 JSON 时遇到问题。
这是 Jersey 端点的片段,它通过返回的 Response 对象生成 MediaType.APPLICATION_JSON:
数据DTO.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}