moxy json介绍_MOXy的对象图和动态JAXB

moxy json介绍

JAXB(JSR-222)使您可以轻松地将域类的实例转换为XML。 EclipseLink MOXy实现提供了一个称为Dynamic JAXB的扩展,在其中,您可以使用诸如DynamicEntity之类的映射实例代替真实的类​​。 您可以使用采用属性名称的get和set方法(即customer.get(“ address”)customer.set('name“,” Jane Doe“)访问DynamicEntity上的数据。在本文中,我们首先将基于外部映射文件引导动态JAXBContext ,然后将XML文档解组到动态实体,最后将应用对象图来确定结果JSON输出的范围。

您可以从2013年3月24日开始从每晚下载EclipseLink 2.5.0每晚下载,以尝试使用此功能:

  • http://www.eclipse.org/eclipselink/downloads/nightly.php

动态Java模型

对于静态模型,元数据是从Java类派生的,并通过提供的任何元数据进行扩充(请参阅: JAXB –不需要注释 )。 由于在MOXy的动态JAXB中没有域类,因此类型必须完全由元数据定义。 可以从XML模式完成此操作,也可以在本示例中使用MOXy的外部映射文档完成此操作。

oxm.xml

由于没有真正的Java类,因此在外部映射文档中,我们需要指定每个映射,并为每个映射指定Java属性的类型。

<?xml version="1.0"?>
<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"package-name="blog.objectgraphs.dynamic"><java-types><java-type name="Customer"><xml-named-object-graphs><xml-named-object-graph name="contact info"><xml-named-attribute-node name="name"/><xml-named-attribute-node name="billingAddress" subgraph="location"/><xml-named-attribute-node name="phoneNumbers" subgraph="simple"/><xml-named-subgraph name="location"><xml-named-attribute-node name="city"/><xml-named-attribute-node name="province"/></xml-named-subgraph></xml-named-object-graph></xml-named-object-graphs><xml-root-element/><java-attributes><xml-attribute java-attribute="id" type="java.lang.Integer"/><xml-element java-attribute="name" type="java.lang.String"/><xml-element java-attribute="billingAddress" type="blog.objectgraphs.dynamic.Address"/><xml-element java-attribute="shippingAddress" type="blog.objectgraphs.dynamic.Address"/><xml-element java-attribute="phoneNumbers" name="phoneNumber" type="blog.objectgraphs.dynamic.PhoneNumber" container-type="java.util.List"><xml-element-wrapper/></xml-element></java-attributes></java-type><java-type name="Address"><java-attributes><xml-element java-attribute="street" type="java.lang.String"/><xml-element java-attribute="city" type="java.lang.String"/><xml-element java-attribute="province" type="java.lang.String"/><xml-element java-attribute="postalCode" type="java.lang.String"/></java-attributes></java-type><java-type name="PhoneNumber"><xml-named-object-graphs><xml-named-object-graph name="simple"><xml-named-attribute-node name="value"/></xml-named-object-graph></xml-named-object-graphs><java-attributes><xml-attribute java-attribute="type" type="java.lang.String"/><xml-value java-attribute="value" type="java.lang.String"/></java-attributes></java-type></java-types>
</xml-bindings>

jaxb.properties

jaxb.properties文件用于指定JAXB提供程序。 对于动态JAXB,此文件的内容与使用MOXy时的通常内容略有不同(与将EclipseLink MOXy指定为JAXB Provider相比 )。 该文件与域模型放在同一包中,因为这里有一个虚拟域模型, jaxb.properties文件将是blog.objectgraphs.dynamic包中唯一的真实项目。

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContextFactory

示范代码

下面我们将探讨使用对象图的两种不同方法。

演示–通过元数据指定的对象图

在下面的演示代码中,我们将利用外部映射文档中定义的对象图。 对象图是为动态模型定义的,与为相应的静态模型完全一样(请参见: MOXy的对象图– XML和JSON的输入/输出局部模型 )。 唯一不同的是,我们从解组调用中获得的对象是DynamicEntity的实例,而不是Customer的实例。

package blog.objectgraphs.dynamic;import java.io.File;
import java.util.*;
import javax.xml.bind.*;
import org.eclipse.persistence.dynamic.DynamicEntity;
import org.eclipse.persistence.jaxb.JAXBContextProperties;
import org.eclipse.persistence.jaxb.MarshallerProperties;public class DemoMetadata {public static void main(String[] args) throws Exception {Map<String, Object> properties = new HashMap<String, Object>(1);properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, "blog/objectgraphs/dynamic/oxm.xml");JAXBContext jc = JAXBContext.newInstance("blog.objectgraphs.dynamic", DemoMetadata.class.getClassLoader(), properties);Unmarshaller unmarshaller = jc.createUnmarshaller();File xml = new File("src/blog/objectgraphs/dynamic/input.xml");DynamicEntity customer = (DynamicEntity) unmarshaller.unmarshal(xml);// Output XMLMarshaller marshaller = jc.createMarshaller();marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);marshaller.marshal(customer, System.out);// Output XML - Based on Object Graphmarshaller.setProperty(MarshallerProperties.OBJECT_GRAPH, "contact info");marshaller.marshal(customer, System.out);// Output JSON - Based on Object Graphmarshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json");marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, false);marshaller.setProperty(MarshallerProperties.JSON_WRAPPER_AS_ARRAY_NAME, true);marshaller.marshal(customer, System.out);}}

演示–以编程方式创建的对象图

在下面的演示代码中,我们将以编程方式创建对象图。 对象图是为动态模型创建的,与为相应的静态模型创建的完全一样(请参阅: MOXy的对象图谱-从XML和JSON快速往返于部分模型 )。 不同之处在于,我们使用动态实体的名称而非类来创建对象图,并且从解组调用中获取了DynamicEntity的实例而不是Customer

package blog.objectgraphs.dynamic;import java.io.File;
import java.util.*;
import javax.xml.bind.*;
import org.eclipse.persistence.dynamic.DynamicEntity;
import org.eclipse.persistence.jaxb.JAXBContextProperties;
import org.eclipse.persistence.jaxb.JAXBHelper;
import org.eclipse.persistence.jaxb.MarshallerProperties;
import org.eclipse.persistence.jaxb.ObjectGraph;
import org.eclipse.persistence.jaxb.Subgraph;public class DemoRuntime {public static void main(String[] args) throws Exception {Map<String, Object> properties = new HashMap<String, Object>(1);properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, "blog/objectgraphs/dynamic/oxm.xml");JAXBContext jc = JAXBContext.newInstance("blog.objectgraphs.dynamic", DemoMetadata.class.getClassLoader(), properties);Unmarshaller unmarshaller = jc.createUnmarshaller();File xml = new File("src/blog/objectgraphs/dynamic/input.xml");DynamicEntity customer = (DynamicEntity) unmarshaller.unmarshal(xml);// Output XMLMarshaller marshaller = jc.createMarshaller();marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);marshaller.marshal(customer, System.out);// Create the Object GraphObjectGraph contactInfo = JAXBHelper.getJAXBContext(jc).createObjectGraph("blog.objectgraphs.dynamic.Customer");contactInfo.addAttributeNodes("name");Subgraph location = contactInfo.addSubgraph("billingAddress");location.addAttributeNodes("city", "province");Subgraph simple = contactInfo.addSubgraph("phoneNumbers");simple.addAttributeNodes("value");// Output XML - Based on Object Graphmarshaller.setProperty(MarshallerProperties.OBJECT_GRAPH, contactInfo);marshaller.marshal(customer, System.out);// Output JSON - Based on Object Graphmarshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json");marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, false);marshaller.setProperty(MarshallerProperties.JSON_WRAPPER_AS_ARRAY_NAME, true);marshaller.marshal(customer, System.out);}}

输入输出

对于元数据驱动的演示和程序化演示,以下输入和输出相同。

input.xml /输出

我们将使用以下文档来填充我们的域模型。 我们还将撤回封送它,以证明所有内容均已实际映射。

<?xml version="1.0" encoding="UTF-8"?>
<customer id="123"><name>Jane Doe</name><billingAddress><street>1 A Street</street><city>Any Town</city><province>Ontario</province><postalCode>A1B 2C3</postalCode></billingAddress><shippingAddress><street>2 B Road</street><city>Another Place</city><province>Quebec</province><postalCode>X7Y 8Z9</postalCode></shippingAddress><phoneNumbers><phoneNumber type="work">555-1111</phoneNumber><phoneNumber type="home">555-2222</phoneNumber></phoneNumbers>
</customer>

基于对象图的XML输出

下面的XML由与上一个XML文档完全相同的模型生成。 区别在于我们利用对象图来选择映射内容的子集。

<?xml version="1.0" encoding="UTF-8"?>
<customer><name>Jane Doe</name><billingAddress><city>Any Town</city><province>Ontario</province></billingAddress><phoneNumbers><phoneNumber>555-1111</phoneNumber><phoneNumber>555-2222</phoneNumber></phoneNumbers>
</customer>

基于对象图的JSON输出

以下是与以JSON表示的先前XML文档相同的子集。 我们使用了新的JSON_WRAPPER_AS_ARRAY_NAME属性(请参阅绑定到JSON和XML –处理集合 )来改善集合值的表示形式。

{"name" : "Jane Doe","billingAddress" : {"city" : "Any Town","province" : "Ontario"},"phoneNumbers" : [ "555-1111", "555-2222" ]
}

参考: Java XML和JSON绑定博客中的JCG合作伙伴 Blaise Doughan的MOXy的对象图和动态JAXB 。

翻译自: https://www.javacodegeeks.com/2013/04/moxys-object-graphs-dynamic-jaxb.html

moxy json介绍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349228.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 查看服务器作业,linux – 如何在服务器负载较低时运行作业?

我有一个运行磁盘快照的命令(在EC2上,冻结XFS磁盘并运行EBS快照命令),该命令设置为作为cron作业定期运行.理想情况下,如果在任务计划运行时磁盘被大量使用,我希望能够将命令延迟一段时间.我担心使用nice / ionice可能没有正确的效果,因为我希望脚本在运行时以高优先级运行(即等…

wordcloud python3.6能用吗_Python3.6环境下安装wordcloud模块遇到的问题及解决办法

“error: Microsoft Visual C 14.0 is required…”问题解决今天在Python 3.6环境中&#xff0c;制作词云&#xff0c;需要安装wordcloud模块&#xff0c;在安装的过程中遇到了“error: Microsoft Visual C 14.0 is required…” 的问题&#xff0c;很是烦恼&#xff0c;最后找…

使用基本身份验证来保护Spring Boot REST API

这是我的Spring Boot Blog帖子系列的第三篇文章。 在第一篇文章中&#xff0c;我谈到了我使用Spring Boot创建RESTFul Services的经验。 然后我将样本扩展到 与Swagger文档集成 。 在这篇文章中&#xff0c;我将在安全方面扩展上述示例。 什么是API安全性 API安全性广泛&…

使用2.26内核的linux,介绍linux 2.6.9-42内核升级到linux 2.6.26-42的方法

介绍linux 2.6.9-42内核升级到linux 2.6.26-42的方法来源&#xff1a;互联网作者&#xff1a;佚名时间&#xff1a;2013-04-10 13:32这篇升级Linux内容的文章&#xff0c;是基于Red Hat的Linux版本&#xff0c;从linux 2.6.9-42内核升级到linux 2.6.26-42的方法&#xff0c;对于…

python xlwt xlrd 写入一行_自己总结python用xlrd\xlwt读写excel

1.首先安装xlrd\xlwt模块xlrd模块下载地址:https://pypi.python.org/pypi/xlrdxlwt模块下载地址:https://pypi.python.org/pypi/xlwtlinux 安装命令 python setup.py installwindos 安装命令 setup.py install2.使用方法大全基础方法推荐请看这里:http://blog.csdn.net/mr__fan…

linux时间路径,关于linux中的时间 时区问题

本文部分来源于&#xff1a; http://hi.baidu.com/peruke/blog/item/b8de06ec6a04583b27979132.html系统是fedora&#xff1a;glibc实现了从RTC时间到人可读时间的一个转换&#xff0c;一般系统不适用 环境变量TZ进行时区的设置&#xff0c;因为环境变量存在一些缺陷&#xff…

Java命令行界面(第1部分):Apache Commons CLI

尽管我通常使用Groovy编写要从命令行运行的JVM托管脚本&#xff0c;但是有时候我需要解析Java应用程序中的命令行参数&#xff0c;并且有很多库可供Java开发人员用来解析命令行参数。 在本文中&#xff0c;我将介绍这些Java命令行解析库中最著名的一种&#xff1a; Apache Comm…

python自带的idle输入python_打开python自带IDLE出的问题

打开python自带IDLE编辑器时出的问题IDLE cant bind to a TCP/IP port, which is necessary tocommunicate with its Python execution server. This might bebecause no networking is installed on this computer. Run IDLEwith the -n command line switch to start without…

linux 虚拟机新增磁盘,linux(虚拟机)下新增磁盘配置

Linux的硬盘识别:(1)”fdisk -l”命令可以列出系统中当前连接的硬盘设备和分区信息.新硬盘没有分区信息,则只显示硬盘大小信息.(2)创建新硬盘分区命令参数&#xff1a;fdisk可以用m命令来看fdisk命令的内部命令&#xff1b;a&#xff1a;命令指定启动分区&#xff1b;d&#xf…

丙烯怎么做成流体丙烯_韧性好强度高的聚丙烯复合材料怎么做?让人工智能来帮忙...

01背景介绍聚丙烯(PP)是一种应用广泛的通用塑料&#xff0c;价格便宜、力学性能好、热稳定性高&#xff0c;在机械、汽车、电子电器、建筑、纺织、包装和食品工业等领域应用广泛。聚丙烯韧性和冲击强度不高&#xff0c;限制了它的应用。加入热塑性弹性体(TPE)&#xff0c;如苯乙…

1.x到2.x的迁移:可观察与可观察:RxJava FAQ

标题不是错误。 rx.Observable 1.x的io.reactivex.Observable与2.x的io.reactivex.Observable完全不同。 盲目升级rx依赖关系并重命名项目中的所有导入将进行编译&#xff08;稍作更改&#xff09;&#xff0c;但不能保证相同的行为。 在项目的早期&#xff0c; Observable in …

linux 线程 拷贝,linux下实现多线程拷贝命令

实现多线程拷贝命令,如&#xff1a;./multithread_copy srcfile destfile N(拷贝线程个数)难点&#xff1a;内存映射mmap。给每一个线程合理的分配任务。多线程的实现。具体的实现代码如下&#xff1a;/********************************************************************…

vivado安装_Vivado下载与安装指南

Vivado下载与安装指南目前&#xff0c;vivado已推出2019.1版本&#xff0c;实验室所安装的为2018.3版本&#xff0c;由于软件向下兼容的特性&#xff0c;建议安装2018版本&#xff0c;若安装2019版本&#xff0c;请自带笔记本&#xff0c;安装过程与之前没有差别&#xff0c;这…

linux中kafka主题修改分区,kafka_2.11-2.0.0的部署与配置修改

1 [yunmini01 config]$ pwd2 /app/kafka/config3 [yunmini01 config]$ vim server.properties4 ############################# Server Basics #############################5 # 每一个broker在集群中的唯一标示★★★6 # 比如mini01 为0 mini02 为1 mini03 为27 broker.id089…

python中字符串乘法_python leetcode 字符串相乘实例详解

给定两个以字符串形式表示的非负整数 num1 和 num2 &#xff0c;返回 num1 和 num2 的乘积&#xff0c;它们的乘积也表示为字符串形式。示例 1:输入: num1 "2", num2 "3"输出: "6"示例 2:输入: num1 "123", num2 "456&quo…

嵌入式基于linux电机控制器,基于嵌入式Linux的移动机器人控制系统

使用select机制监控是否语音识别结果&#xff0c;在超出等待时间后&#xff0c;会退出等待并重新初始化语音模块LD3320&#xff0c;释放公共资源&#xff0c;这样也使得系统能够及时响应LD3320的MP3播放功能&#xff0c;避免了在长时间没有语音识别结果时&#xff0c;系统进入卡…

jdk8运行jdk7的代码_即使在jdk中也有错误的代码

jdk8运行jdk7的代码Java 7&#xff0c;TreeSet和NullPointerException。 最近&#xff0c;我尝试用Java 7编译一个用Java 6开发的项目。在执行测试过程中发生了很多有趣的事情&#xff0c;在Java 6中使用Java 7平稳运行的测试失败了&#xff01; 因此&#xff0c;我必须理解为什…

zen of python什么意思_如何理解「The Zen of Python」?

import thisThe Zen of Python, by Tim PetersPython之禅 &#xff0c;by Tim PetersBeautiful is better than ugly.优美好于丑陋(Python 以优美的代码为其风格&#xff0c;不要写丑陋的代码)Explicit is better than implicit.明了好于隐晦(Python的每一行代码、每一个变量、…

linux用pipe创建的文件类型,linux文件类型之 管道

inux管道管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间&#xff0c;这是它与有名管道的最大区别。有名管道叫namedpipe或者FIFO(先进先出)&#xff0c;可以用函数mkfifo(…

Spring Webflux – Kotlin DSL –实现的演练

在先前的博客文章中&#xff0c;我描述了Spring Web Framework中的响应式编程支持Spring Webflux如何使用基于Kotlin的DSL使用户能够以非常直观的方式描述路由。 在这里&#xff0c;我想探索一些底层实现。 描述一组端点的样本DSL看起来像这样&#xff1a; package sample.ro…