【问题标题】:JSON serialization in Jersey - How to ignore XmlJavaTypeAdapter for serializing a map?Jersey 中的 JSON 序列化 - 如何忽略 XmlJavaTypeAdapter 来序列化地图?
【发布时间】:2011-12-20 23:49:35
【问题描述】:

在我基于 Jersey 的 REST Web 服务中,我需要提供 xml 和 json 输出。 Result 类有一个映射,用 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 序列化失败了。有解决办法吗?

【问题讨论】:

    标签: java json jaxb jersey


    【解决方案1】:

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

    当然这个溶胶的缺点

    @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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-04
      • 2020-02-18
      • 1970-01-01
      相关资源
      最近更新 更多