EclipseLink MOXy和用于JSON处理的Java API –对象模型API

用于JSON处理的Java API(JSR-353)是用于生成和使用JSON的Java标准,它是Java EE 7的一部分引入。JSR-353包括对象(类似于DOM)和流(类似于StAX)API。 在本文中,我将演示我们在EclipseLink 2.6中添加到MOXy的JSON绑定中的最初JSR-353支持。 现在,您可以使用MOXy进行封送:

  • javax.json.JsonArrayBuilder
  • javax.json.JsonObjectBuilder

并从以下方面进行调度:

  • javax.json.JsonStructure
  • javax.json.JsonObject
  • javax.json.JsonArray

您可以使用每晚构建的EclipseLink 2.6.0进行尝试:

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

这里提供了JSR-353参考实现:

  • https://java.net/projects/jsonp/downloads/download/ri/javax.json-ri-1.0.zip

Java模型

以下是我们将在本文中使用的简单客户模型。 请注意,对于本示例,我们仅使用标准的JAXB(JSR-222)批注。

顾客

package blog.jsonp.moxy;import java.util.*;
import javax.xml.bind.annotation.*;@XmlType(propOrder={"id", "firstName", "lastName", "phoneNumbers"})
public class Customer {private int id;private String firstName;private String lastName;private List<PhoneNumber> phoneNumbers = new ArrayList<PhoneNumber>();public int getId() {return id;}public void setId(int id) {this.id = id;}public String getFirstName() {return firstName;}public void setFirstName(String firstName) {this.firstName = firstName;}@XmlElement(nillable=true)public String getLastName() {return lastName;}public void setLastName(String lastName) {this.lastName = lastName;}@XmlElementpublic List<PhoneNumber> getPhoneNumbers() {return phoneNumbers;}}

电话号码

package blog.jsonp.moxy;import javax.xml.bind.annotation.*;@XmlAccessorType(XmlAccessType.FIELD)
public class PhoneNumber {private String type;private String number;public String getType() {return type;}public void setType(String type) {this.type = type;}public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}}

jaxb.properties

要将MOXy指定为JAXB提供程序,您需要在与域模型相同的包中包含一个名为jaxb.properties的文件,并带有以下条目(请参阅:将EclipseLink MOXy指定为JAXB提供程序 )

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

元帅演示

在下面的演示代码中,我们将结合使用JSR-353和MOXy API来生成JSON。 JSR-353的JsonObjectBuilderJsonArrayBuilder用于生成JsonObjectJsonArray的实例。 通过将MOXy包装在MOXy的JsonObjectBuilderResultJsonArrayBuilderResult实例中,我们可以使用MOXy封送这些构建器。

package blog.jsonp.moxy;import java.util.*;
import javax.json.*;
import javax.json.stream.JsonGenerator;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.JAXBContextProperties;
import org.eclipse.persistence.oxm.json.*;public class MarshalDemo {public static void main(String[] args) throws Exception {// Create the EclipseLink JAXB (MOXy) MarshallerMap<String, Object> jaxbProperties = new HashMap<String, Object>(2);jaxbProperties.put(JAXBContextProperties.MEDIA_TYPE, "application/json");jaxbProperties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false);JAXBContext jc = JAXBContext.newInstance(new Class[] {Customer.class}, jaxbProperties);Marshaller marshaller = jc.createMarshaller();// Create the JsonArrayBuilderJsonArrayBuilder customersArrayBuilder = Json.createArrayBuilder();// Build the First CustomerCustomer customer = new Customer();customer.setId(1);customer.setFirstName("Jane");customer.setLastName(null);PhoneNumber phoneNumber = new PhoneNumber();phoneNumber.setType("cell");phoneNumber.setNumber("555-1111");customer.getPhoneNumbers().add(phoneNumber);// Marshal the First Customer Object into the JsonArrayJsonArrayBuilderResult result = new JsonArrayBuilderResult(customersArrayBuilder);marshaller.marshal(customer, result);// Build List of PhoneNumer Objects for Second CustomerList<PhoneNumber> phoneNumbers = new ArrayList<PhoneNumber>(2);PhoneNumber workPhone = new PhoneNumber();workPhone.setType("work");workPhone.setNumber("555-2222");phoneNumbers.add(workPhone);PhoneNumber homePhone = new PhoneNumber();homePhone.setType("home");homePhone.setNumber("555-3333");phoneNumbers.add(homePhone);// Marshal the List of PhoneNumber ObjectsJsonArrayBuilderResult arrayBuilderResult = new JsonArrayBuilderResult();marshaller.marshal(phoneNumbers, arrayBuilderResult);customersArrayBuilder// Use JSR-353 APIs for Second Customer's Data.add(Json.createObjectBuilder().add("id", 2).add("firstName", "Bob").addNull("lastName")// Included Marshalled PhoneNumber Objects.add("phoneNumbers", arrayBuilderResult.getJsonArrayBuilder())).build();// Write JSON to System.outMap<String, Object> jsonProperties = new HashMap<String, Object>(1);jsonProperties.put(JsonGenerator.PRETTY_PRINTING, true);JsonWriterFactory writerFactory = Json.createWriterFactory(jsonProperties);JsonWriter writer = writerFactory.createWriter(System.out);writer.writeArray(customersArrayBuilder.build());writer.close();}}

输出量

以下是运行Marshal演示( MarshalDemo )的输出。 突出显示的部分(第2-12和18-25行)对应于从我们的Java模型填充的部分。

[{"id":1,"firstName":"Jane","lastName":null,"phoneNumbers":[{"type":"cell","number":"555-1111"}]},{"id":2,"firstName":"Bob","lastName":null,"phoneNumbers":[{"type":"work","number":"555-2222"},{"type":"home","number":"555-3333"}]}
]

解组演示

MOXy使您可以从JSR-353 JsonStructureJsonObjectJsonArray )解组。 要做到这一点只需换歼sonStructure在莫西的JsonStructureSource的实例,并使用需要来源的一个实例解组操作之一。

package blog.jsonp.moxy;import java.io.FileInputStream;
import java.util.*;
import javax.json.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.JAXBContextProperties;
import org.eclipse.persistence.oxm.json.JsonStructureSource;public class UnmarshalDemo {public static void main(String[] args) throws Exception {try (FileInputStream is = new FileInputStream("src/blog/jsonp/moxy/input.json")) {// Create the EclipseLink JAXB (MOXy) UnmarshallerMap<String, Object> jaxbProperties = new HashMap<String, Object>(2);jaxbProperties.put(JAXBContextProperties.MEDIA_TYPE, "application/json");jaxbProperties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false);JAXBContext jc = JAXBContext.newInstance(new Class[] {Customer.class}, jaxbProperties);Unmarshaller unmarshaller = jc.createUnmarshaller();// Parse the JSONJsonReader jsonReader = Json.createReader(is);// Unmarshal Root Level JsonArrayJsonArray customersArray = jsonReader.readArray();JsonStructureSource arraySource = new JsonStructureSource(customersArray);List<Customer> customers = (List<Customer>) unmarshaller.unmarshal(arraySource, Customer.class).getValue();for(Customer customer : customers) {System.out.println(customer.getFirstName());}// Unmarshal Nested JsonObjectJsonObject customerObject = customersArray.getJsonObject(1);JsonStructureSource objectSource = new JsonStructureSource(customerObject);Customer customer = unmarshaller.unmarshal(objectSource, Customer.class).getValue();for(PhoneNumber phoneNumber : customer.getPhoneNumbers()) {System.out.println(phoneNumber.getNumber());}}}}

输入(input.json)

下面JSON输入将使用JsonReader转换为JsonArray。

[{"id":1,"firstName":"Jane","lastName":null,"phoneNumbers":[{"type":"cell","number":"555-1111"}]},{"id":2,"firstName":"Bob","lastName":null,"phoneNumbers":[{"type":"work","number":"555-2222"},{"type":"home","number":"555-3333"}]}
]

输出量

以下是运行解演示程序( UnmarshalDemo )的输出。

Jane
Bob
555-2222
555-3333

参考: EclipseLink MOXy和用于JSON处理的Java API –来自我们的JCG合作伙伴 Blaise Doughan的Java XML和JSON绑定博客中的对象模型API 。

翻译自: https://www.javacodegeeks.com/2013/07/eclipselink-moxy-and-the-java-api-for-json-processing-object-model-apis.html

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

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

相关文章

matlab main函数_Python 和MATLAB 制作Gif 图像

主要内容概述&#xff1a;预备知识MATLAB 代码实现GIF使用imageio 生成GIF使用animation 交互式方式生成GIF总结0&#xff0c;预备知识首先了解下什么是GIF 图片&#xff0c;以及常用的图片格式。GIF的全称是Graphics Interchange Format&#xff0c;可译为图形交换格式&#x…

C# MVC IOC、依赖注入

在MVC5中依赖注入&#xff0c;本文介绍通过扫描类型RegisterAssemblyTypes来进行注册 另外还有扫描模块RegisterAssemblyModules来注册 使用Autofac框架进行组件的依赖注入 Autofac是.NET领域最为流行的IOC框架之一&#xff0c;传说是速度最快的一个 先通过Nuget安装程序包 PM&…

ORB-SLAM2的特征提取算法

ORB-SLAM2跟踪线程对相机输入的每一帧图像进行跟踪处理&#xff0c;如下图所示&#xff0c;主要包括4步&#xff0c;提取ORB特征、从上一帧或者重定位来估计初始位姿、局部地图跟踪和关键帧处理。 以下结合相关理论知识&#xff0c;阅读ORB-SLAM2源代码&#xff0c;从而理解ORB…

在vue中使用SockJS实现webSocket通信

最近接到一个业务需求,需要做一个聊天信息的实时展示的界面,这就需要和服务器端建立webSocket连接,从而实现数据的实时获取和视图的实时刷新.在此将我的实现记录下来,希望可以给有同样需求的人一些帮助.废话少说,下面我就来讲一下我的实现过程: 前提 要进行文章中的代码的测试…

DI / CDI –基础

简介&#xff08;DI / CDI基础&#xff09; 首先&#xff0c;我认为对此会有一些困惑&#xff0c;但事实是&#xff0c;它们是相同的–不同之处在于用法及其用途。 DI&#xff08;依赖注入&#xff09;是通用术语–该功能基本上是在任何应用程序上进行Bean发现和Bean连接过程的…

引导界面图标好大_游戏里那些图标和界面,原来是这么设计出来的?

UI设计最硬核的思维 就是功能微信现在在做一种全面连接的功能&#xff0c;而游戏需要实现的是人机互动的功能。实现并完善功能&#xff0c;是互联网、游戏、网站、渴望UI人才的根本原因。如果说有电脑的世界是一片很大的面&#xff0c;那么可视化的操作&#xff0c;都是UI设计师…

爬格子呀9.17(图论)

刘汝佳的紫书差不多就告一段落吧&#xff0c;我觉得可以了&#xff0c;怎么说呢&#xff0c;这书也陪着自己走了一年多了吧&#xff0c;也目睹了从一个啥也不会的萌新到一个稍微会一点的萌新的转变。 差不多开始下本书吧&#xff0c;自己也大三了&#xff0c;时间真的有点紧啊w…

一个vue加egg.js的博客

之前自己的博客是用hexo做的&#xff0c;后面想做一个有后台的博客就打算用vue加node来试试&#xff0c;于是就有了这个博客。 项目地址 W-Blog W-Blog是一个基于vue和node的小小小博客 前端用vue&#xff0c;后端用egg.js 快速入门 技术栈 前端&#xff1a; 用户端&#…

js判断处理undefined类型的数据

code: resFlag response.result.data.result; /查询客户为白名单用户时,将"*该企业已被列入黑名单"标记清除 if(typeof resFlag "undefined"){$("#companynameisblack").text(""); }转载于:https://www.cnblogs.com/YLQBL/p/8819696…

批处理写入以及动态与参数化SQL,数据库的性能如何?

批处理写入是最有效的数据库优化之一。 批处理写入受大多数现代数据库和JDBC标准的一部分支持&#xff0c;并且受大多数JPA提供程序支持。 普通数据库访问包括在单独的数据库/网络访问中将每个DML&#xff08;插入&#xff0c;更新&#xff0c;删除&#xff09;语句发送到数据…

android音量图标不见了,电脑声音图标不见了如何解决?

最近有电脑用户反映&#xff0c;看视频时觉得声音太小了&#xff0c;要调大点声&#xff0c;却发现任务栏上的声音图标不见了&#xff0c;想调个声音都难。那么&#xff0c;电脑声音图标不见了如何解决呢?我们一起往下看看。方法步骤一、XP系统下找回任务栏上的声音图标1、重启…

认识iOS系统架构

关于本文&#xff1a; 文章主要介绍iOS系统架构中的四层结构的内容、常用的框架、大致的功能&#xff0c;然后对iOS开发人员的发展提出自己的一些拙见。 一、iOS系统是基于UNIX系统&#xff0c;所有从系统稳定性上来说的确比其他操作系统的产品要好。 iOS在系统架构上分为4层&a…

r语言赋值为na_r语言将空白格替换成NA

有数据集类似user_id qid1371 000013046dc0ab29ef8773eb61aba623 02 0000cfcadfa43ef824669405081165b13 0006ee1acc5321260ba0fbff1fb8f6494 00083f7b8c6170a3fc976d7b99245259 …

Java泛型教程–示例类,接口,方法,通配符等

泛型是Java编程的核心功能之一&#xff0c;它是Java 5中引入的。如果您使用的是Java Collections &#xff0c;并且版本5或更高版本&#xff0c;则可以肯定使用了它。 在集合类中使用泛型非常容易&#xff0c;但是它提供了比仅创建集合类型更多的功能&#xff0c;我们将在本文中…

html5中音乐播放器怎么写,打造属于自己的音乐播放器 HTML5之audio标签

我的音乐播放器HTML5中增加了Audio和Video标签&#xff0c;这两个标签的用法非常相似。功能却是相当强大&#xff0c;我们先来看一下Audio标签各个浏览器的支持情况。这里用的依然是Can I Use这个在线网站&#xff0c;相信学习前端的同学应该都不陌生。Can I Use我们可以看到&a…

初识react(四) react中异步解决方案之 redux-saga

回顾 初识react(一) 揭开jsx语法和虚拟DOM面纱初识react(二) 实现一个简版的html redux.js的demo初识react(三)在 react中使用redux来实现简版计数器初识react(四) react中异步解决方案之 redux-saga初识react(五) 数据流终极解决方案 dva(零配置) 今天demo是实现一个异步的计…

C# WinFrom 关于MDI

dev是一个牛B 到没边的控件 我们正常用winform做个原始mdi窗体 一点都不好看 但 用的dev只需要一个控件 就可让显示舒服多了 建一个项目 上边放一个 xtraTabbedMdiManager1 一个button1 button1.click如下&#xff1a; Form frm new Form(); frm.MdiParent this; frm.Text &…

Jfinal 文件上传

JFinal上传文件 uploadify 可以在http://www.uploadify.com/ 下载。 在原项目的基础上。 uploadify使用&#xff1a; <input id"file_upload_1" name"file_upload" type"file" multiple"true"> /** param uploader 文件上传方法…

轻量级的开源集成:Apache Camel还是Spring集成?

首先&#xff0c;为全面披露信息&#xff0c;在过去的1.5年中&#xff0c; 我一直担任 FuseSource&#xff08;现为Red Hat&#xff09; 的顾问&#xff0c;为零售&#xff0c;运输&#xff0c;银行/金融等不同行业的大型和小型公司提供SOA和集成项目支持。我的专长是使用该领域…

blue html中转换,Vue/Vue中Html和Markdown互相转换/README.md · bluemoon/LearningNotes - Gitee.com...

# Vue中Html和Markdown互相转换## 前言最近想实现的一个功能&#xff0c;就是将系统中的博客进行导出成Markdown格式&#xff0c;后面经过了调研发现有两种方法能够满足需求&#xff0c;一个是Java后台中将HTML转换成Markdown&#xff0c; 然后导出。第二种方式是在客户端将Htm…