Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何为JAXB MOXy编写JsonStructure (JSR-353) XmlAdaptor?

如何为JAXB MOXy编写JsonStructure (JSR-353) XmlAdaptor?
EN

Stack Overflow用户
提问于 2015-02-24 17:58:05
回答 1查看 1.4K关注 0票数 2

我需要将一些任意的JSON内容包装到POJO中,然后使用MOXy/JAXB序列化到JSON,但是我不知道如何将JsonObject与JAXB绑定。我只需要编组JsonObject,不需要解组。

即拥有POJO:

代码语言:javascript
运行
AI代码解释
复制
@XmlRootElement
public class MsgPOJO {
  public String type;
  public Object content;
}

如何将任意JSON内容放入MsgPOJO.content中,并将其序列化:

代码语言:javascript
运行
AI代码解释
复制
String jsonDoc = "{\"prop\":\"value\"}";
MsgPOJO msg = new MsgPOJO();
msg.type = "whatever";
msg.content = jsonDoc;

因此这将是输出:

代码语言:javascript
运行
AI代码解释
复制
{
  "type": "whatever",
  "content": {
    "prop": "value"
   }
}

我正在考虑用@XmlJavaTypeAdapterMsgPOJO.content进行注释,但这似乎无济于事,因为JSON内容可能是任意的。

如果moxy可以编组JsonObjectJsonStructure就好了,这样我就可以像这样定义POJO:

代码语言:javascript
运行
AI代码解释
复制
@XmlRootElement
public class MsgPOJO {
  public String type;
  public JsonObject content;
}

有没有办法做到这一点呢?或者它是MOXy/JAXB中的一个限制?

EN

回答 1

Stack Overflow用户

发布于 2015-02-24 23:02:52

默认情况下,MOXy不支持JSON-P结构的编组/解组,您需要实现XmlJavaTypeAdapter。下面是JsonObject适配器的示例。

MsgPOJO.java

代码语言:javascript
运行
AI代码解释
复制
package org.eclipse.persistence.testing.jsonp;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

/**
 * Created by mvojtek on 24/02/15.
 */
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class MsgPOJO {

    public String type;

    public JsonObjectWrapper content;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public JsonObjectWrapper getContent() {
        return content;
    }

    public void setContent(JsonObjectWrapper content) {
        this.content = content;
    }

    @Override
    public String toString() {
        return "MsgPOJO{" +
                "type='" + type + '\'' +
                ", content=" + content +
                '}';
    }
}

JsonObjectWrapper.java

代码语言:javascript
运行
AI代码解释
复制
package org.eclipse.persistence.testing.jsonp;

import javax.json.JsonObject;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

/**
 * Created by mvojtek on 24/02/15.
 */
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class JsonObjectWrapper {

    @XmlJavaTypeAdapter(JsonObjectAdapter.class)
    private JsonObject jsonObject;

    public JsonObject getJsonObject() {
        return jsonObject;
    }

    public void setJsonObject(JsonObject jsonObject) {
        this.jsonObject = jsonObject;
    }

    @Override
    public String toString() {
        return "JsonObjectWrapper{" +
                "jsonObject=" + jsonObject +
                '}';
    }
}

JsonObjectAdapter.java

代码语言:javascript
运行
AI代码解释
复制
package org.eclipse.persistence.testing.jsonp;

import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonReader;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import java.io.StringReader;

/**
 * Created by mvojtek on 24/02/15.
 */
public final class JsonObjectAdapter extends XmlAdapter<String,JsonObject> {
    @Override
    public String marshal(JsonObject v) throws Exception {
        if (null == v) {
            return null;
        }
        return v.toString();
    }

    @Override
    public JsonObject unmarshal(String v) throws Exception {
        if (null == v) {
            return null;
        }
        JsonReader jsonReader = Json.createReader(new StringReader(v));
        return jsonReader.readObject();
    }
}

Test.java

代码语言:javascript
运行
AI代码解释
复制
package org.eclipse.persistence.testing.jsonp;

import org.eclipse.persistence.jaxb.JAXBContextFactory;
import org.eclipse.persistence.jaxb.JAXBContextProperties;
import org.eclipse.persistence.oxm.MediaType;

import javax.json.Json;
import javax.json.JsonReader;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
import java.io.StringWriter;

public class Test {

    public static void main(String[] args) throws Exception {

        //marshal
        JAXBContext jaxbContext = JAXBContextFactory.createContext(new Class[]{MsgPOJO.class}, null);

        Marshaller marshaller = jaxbContext.createMarshaller();
        marshaller.setProperty(JAXBContextProperties.MEDIA_TYPE, MediaType.APPLICATION_JSON);

        MsgPOJO msgPOJO = new MsgPOJO();
        msgPOJO.setType("myType");

        JsonReader jsonReader = Json.createReader(new StringReader("{\"prop\":\"value\"}"));

        JsonObjectWrapper wrapper = new JsonObjectWrapper();
        wrapper.setJsonObject(jsonReader.readObject());

        msgPOJO.setContent(wrapper);

        StringWriter marshallerOutput = new StringWriter();

        marshaller.marshal(msgPOJO, marshallerOutput);

        String result = marshallerOutput.toString();
        System.out.println("marshal result = "+result);

        //unmarshal
        Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
        unmarshaller.setProperty(JAXBContextProperties.MEDIA_TYPE, MediaType.APPLICATION_JSON);
        unmarshaller.setProperty(JAXBContextProperties.JSON_INCLUDE_ROOT, true);

        MsgPOJO msgPOJO2 = (MsgPOJO)unmarshaller.unmarshal(new StringReader(result));

        System.out.println("msgPOJO2="+msgPOJO2);
    }
}

如果你不需要字符串,你可以借助MyList和MyMap结构来编写通用的结构。在此之后,您可以编写XmlJavaTypeAdapter,它会将JsonObject编组为这个新类型。结果将是json,与输入的字符串表示形式并不完全相同,而是合法的json。

https://github.com/eclipse/eclipselink.runtime/blob/master/moxy/eclipselink.moxy.test/src/org/eclipse/persistence/testing/jaxb/rs/model/MyList.java

https://github.com/eclipse/eclipselink.runtime/blob/master/moxy/eclipselink.moxy.test/src/org/eclipse/persistence/testing/jaxb/rs/model/MyMap.java

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28702924

复制
相关文章
Java xml数据格式返回实现
前言:对于服务器后端开发,接口返回的数据格式一般要求都是json,但是也有使用xml格式
全栈程序员站长
2022/09/13
1.3K0
Java xml数据格式返回实现
springMVC整合JAXB[通俗易懂]
由于项目中要用到将Java对象转为xml返回给调用者。选择使用JAXB,由于它是JDK自带的。不须要引入其它Jar包
全栈程序员站长
2022/07/06
8740
springMVC整合JAXB[通俗易懂]
JAXB应用实例
过往的项目中数据存储都离不开数据库,不过最近做的一个项目的某些数据(比如人员信息、菜单、权限等等)却完全没有涉及任何数据库操作,直接XML搞定。这里无意比较优劣,因为数据库存储和XML存储本就有不同的适用场景,盲目比较毫无意义,只是因为业务需要,仅此而已。先来概念一下——XML,可扩展标记语言,设计宗旨是用来传输数据而非显示数据,其遵循W3C标准,是一种通用的数据交换格式,具有很强的跨平台性,并且数据无需转换,所以,如果你要将数据做跨平台传输,那么把数据保存在 XML 文件中是有好处的。当然,这里要说明,
用户1615728
2018/04/17
3.7K0
JAXB应用实例
java JAXB 学习
JAXB(Java Architecture for XML Binding)是JDK的一部分,用于Object <-> XML的转换(有点类似于.NET中的XML序列化)。 1、创建XSD 可以使用
菩提树下的杨过
2018/01/24
1.5K0
java JAXB 学习
JAXB使用方式
JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到 XML实例文档。
HUC思梦
2020/09/03
2.5K0
手写编程语言-如何为 GScript 编写标准库
这是一个可以在线运行 GScript 脚本的网站,其本质原理是接收用户的输入源码从而在服务器上运行的服务;这简直就是后门大开的 XSS 攻击,为保住服务器我设置了运行 API 的后端服务的用户权限,这样可以避免执行一些恶意的请求。
crossoverJie
2022/12/20
4920
手写编程语言-如何为 GScript 编写标准库
何为真何为假
还记得第一个提出日心说的人是谁么? 没错, 哥白尼. 但是在那个年代, 所有人都认为太阳围绕着地球转的年代. 哥白尼的发现打破了大家的常识, 甚至于有过了很多年, 日心说才逐渐被大众所接受. 即使到了
烟草的香味
2020/06/09
9760
何为http,何为RPC?
RPC(即Remote Procedure Call,远程过程调用)和HTTP(HyperText Transfer Protocol,超文本传输协议)他们最本质的区别,就是RPC主要工作在TCP协议之上,而HTTP服务主要是工作在HTTP协议之上,我们都知道HTTP协议是在传输层协议TCP之上的,所以效率来看的话,RPC当然是要更胜一筹。
Java架构
2019/06/15
1.4K0
Java_数据交换_JAXB_用法入门
JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到 XML实例文档。
shirayner
2018/08/10
1.8K0
Java_数据交换_JAXB_用法入门
何为内存溢出,何为内存泄露
内存泄漏定义(memory leak):一个不再被程序使用的对象或变量还在内存中占有存储空间。
Java架构
2019/06/15
5.4K0
让你如“老”绅士般编写 Python 命令行工具的开源项目:docopt
在第一篇“初探 docopt”的文章中,我们初步掌握了使用 docopt 的三个步骤,了解了它不同于 argparse 的设计思路。那么 docopt 的使用模式都有哪些呢?其接口描述中都支持哪些语法规则呢?本文将带你深入了解 docopt。
HelloGitHub
2021/05/14
6850
[大佬] 何为"网络"
1945年,冯诺依曼发明了世界上第一台电子计算机。截止到今天,计算机经过了76年的发展,互联网已把全世界几十亿人所拥有或使用或租用的各级计算机,连接在了一起。同时,也把这么多人的心,局部或全部,给拽进去了互联网内。
科控物联
2022/03/29
2760
何为BFC?
何为BFC? BFC(Block Formatting Context),简单讲,它是提供了一个独立布局的环境,内部不会影响外部布局,反之亦然,每个BFC都遵守同一套布局规则。 如何创建BFC? float:left|right position:absolute|fixed display: table-cell|table-caption|inline-block|flex | inline-flex overflow: hidden|scroll|auto BFC有何特性? 内部的Box会在垂直方向,
前端黑板报
2018/01/29
5660
何为实在
image.png 推荐语: 霍金的《大设计》(The Grand Design)与其说是本科普读物,莫如说是相关“实在与终极”的著作。过去几千年间,这个领域更多是哲学家的禁脔。但,二战以降,哲学渐死,已完全跟不上现代科学发展的步伐。忧心于此,霍金此次似乎不得不替哲学家当了回“临时工”。 全书共八章,《存在之谜》、《定律规则》、《何为实在》、《可择历史》、《万物理论》、《选择宇宙》、《表观奇迹》和《伟大设计》,精华是前三章,核心则在《何为实在》。霍金选择了依赖模型的“实在观”:所谓“实在”
腾讯研究院
2018/01/19
9270
何为实在
何为GraphQL?
GraphQL是一种新型的,令人兴奋的,用于特定查询和操作的API。它非常灵活并且有很多好处。 它特别适合以图形和树型为组织的数据。Facebook在2012年研发出了GraphQL并在2015年将其开源。
前端达人
2018/10/18
3.5K1
何为GraphQL?
首发!DevOps@BOC — 器用之道,如琢如磨
我来自中国银行软件中心的一个开发部门,中国银行软件中心从 2013年开始试点敏捷软件开发以及相关CI、CD等实践,而我们内部真正的提 DevOps 比这个要更晚些。
DevOps时代
2018/10/08
1K0
首发!DevOps@BOC — 器用之道,如琢如磨
让你如绅士般基于描述编写 Python 命令行工具的开源项目:docopt
在本系列前面四篇文章中,我们介绍了 argparse 的方方面面。它无疑是强大的,但使用方式上略显麻烦。需要先设置解析器,再定义参数,再解析命令行,最后实现业务逻辑。
HelloGitHub
2021/05/14
3580
如何为非常不确定的行为(如并发)设计安全的 API,使用这些 API 时如何确保安全
.NET 中提供了一些线程安全的类型,如 ConcurrentDictionary<TKey, TValue>,它们的 API 设计与常规设计差异很大。如果你对此觉得奇怪,那么正好阅读本文。本文介绍为这些非常不确定的行为设计 API 时应该考虑的原则,了解这些原则之后你会体会到为什么会有这些 API 设计上的差异,然后指导你设计新的类型。
walterlv
2023/10/22
2180
Java使用JAXB对XML设置属性和属性值
复杂点的原因是名称带有冒号,属性也是,没有操作过JAXB是不容易上手,我来记录下实体的代码。
高久峰
2023/10/12
6320
何为求解器?
最近学习到的关于求解器的新知识总结。首先求解器是用在数学规划问题中的常见工具,那么问题来了,数学中用到的工具和供应链业务有什么相关呢?我们还要继续再往前走一步,看看数学规划问题能为我们解决些什么业务问题。带着这些疑惑请耐心往下看,文章较长。
Act
2021/07/27
10K2

相似问题

Spring Boot + JAXB MOXY

21

如何为JAXB设置浮点格式(json使用eclipse moxy)

10

JAXB/MOXy适应XMLElementWrapper

12

MOXy/JAXB接口注释

10

如何为带JAXB/Moxy注释的POJO类生成JSONSchema

120
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档