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

发布于 2024-12-13 10:41:49 字数 1012 浏览 0 评论 0原文

在我的基于 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 序列化失败。有解决方法吗?

In my Jersey-based REST webservice I need to provide xml and json output. The class Result has a map, annotated with XmlJavaTypeAdapter to correctly serialize it to 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;
    }
}

The XML output looks like:

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

And the json output looks like

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

But I want that it looks like:

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

If I remove the XMlRootElement and the XmlJavaTypeAdapter annotation, the json output looks like I wanted, but then the xml serialization failed. Is there a workaround?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

空气里的味道 2024-12-20 10:41:49

一种可能的解决方案是使用自定义 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;
    }
}

One possible solution is the use an custom ObjectMapperProvider. The Following provider doesn't create an combined mapper for json and xml. So the json serialization doesn't use the xml annoatation.

Of course the disadvantage of this sol

@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;
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文