Jersey中的JSON序列化 - 如何忽略XmlJavaTypeAdapter以序列化地图?

时间:2011-11-03 08:59:09

标签: java json jaxb jersey

在我的基于Jersey的REST Web服务中,我需要提供xml和json输出。类结果有一个地图,用XmlJavaTypeAdapter注释,以正确地将其序列化为xml。

@XmlRootElement
public class Result {

    private Map<String,Integer> results = new HashMap<String, Integer>();

    public Result(){}

    @XmlJavaTypeAdapter(ResultMapAdapter.class)
    public Map<String,SearchResult> getResults() {
        return results;
    }
}

XML输出如下:

<results>
  <result><name>Key1</name><value>Value1</value>
  <result><name>Key2</name><value>Value2</value>
</results>

json输出看起来像

  "result":[{
    "name": "Key1",
    "value": Value1
  },{
    "name": "Key2",
    "value": Value2
  }]

但我希望它看起来像:

  "result":{
    "Key1": Value1,
    "Key2": Value2
  }

如果我删除XMlRootElement和XmlJavaTypeAdapter注释,json输出看起来像我想要的那样,但是xml序列化失败了。有解决方法吗?

1 个答案:

答案 0 :(得分:0)

一种可能的解决方案是使用自定义ObjectMapperProvider。以下提供程序不为json和xml创建组合映射器。所以json序列化不使用xml annoatation。

当然这个溶胶的缺点

@Provider
public class ObjectMapperProvider implements ContextResolver<ObjectMapper> {

    final ObjectMapper defaultObjectMapper;

    public ObjectMapperProvider() {
        defaultObjectMapper = createDefaultMapper();
    }

    @Override
    public ObjectMapper getContext(Class<?> type) {

        return defaultObjectMapper;
    }


    private static ObjectMapper createDefaultMapper() {

        ObjectMapper result = new ObjectMapper();
        result.configure(Feature.INDENT_OUTPUT, true);

        return result;
    }
}