`

EclipseLink Moxy对最新java api for json(JSR-353)的实现

阅读更多
  最新的jave ee 7中,对JSON的解析实现使用的是JSR-353,其中,Eclipse旗下的EclipseLink开源项目向JAVE EE 7中贡献了不少力量,其中包括JPA 2.1 (JSR-338)的实现,另外一个贡献是本文向大家介绍的EclipseLink MOXy项目,它是JAVE EE 7中JAX-RS(REST标准)的一个默认的JSON Provider.
   首先简单介绍下Eclipse旗下的EclipseLink开源项目,它主要用来实现快速将JAVA中的对象转化为各种类型的XML,该项目主要有如下的特性:

支持JAXB中最多的注解
同时支持XML和JSON
支持最新的JPA 2.1
对JPA-RS的增强支持

 MOXY有十分强大的将各类JAVA对象 序列化为XML以及XML反序列化为JAVA对象的能力。这在REST架构的应用中,MOXY可以用来实现JAX-RS标准中的各种转换,

  下面选用一个例子大致讲解下,首先是一个jaxb声明的pojo,如下
@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;
    }

    @XmlElement
    public List<PhoneNumber> getPhoneNumbers() {
        return phoneNumbers;
    }

}


  PhoneNumber类如下:
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;
    }

}


  要使用moxy的话,要在model的相同目录下,放置jaxb.properties 文件,内容为:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

下面来看下如何对对象进行序列化为JSON,使用的是MOXy的 JsonObjectBuilderResult和JsonArrayBuilderResult.

  

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 {
      
        Map<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();

        //创建 JsonArrayBuilder
        JsonArrayBuilder customersArrayBuilder = Json.createArrayBuilder();

        
        Customer 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);

       
        JsonArrayBuilderResult result = 
            new JsonArrayBuilderResult(customersArrayBuilder);
        marshaller.marshal(customer, result);

  
        List<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);

      
        JsonArrayBuilderResult arrayBuilderResult = new JsonArrayBuilderResult();
        marshaller.marshal(phoneNumbers, arrayBuilderResult);

        customersArrayBuilder
            // 用JSR-353 APIs 额外添加数据
            .add(Json.createObjectBuilder()
                .add("id", 2)
                .add("firstName", "Bob")
                .addNull("lastName")
                // Included Marshalled PhoneNumber Objects
                .add("phoneNumbers", arrayBuilderResult.getJsonArrayBuilder())
             )
        .build();

        // Write JSON to System.out
        Map<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();
    }

}


输出为:
[
    {
        "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"
            }
        ]
    }
]

 
然后来一个反序列化的例子:
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")) {
        
            Map<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 JSON
            JsonReader jsonReader = Json.createReader(is);

            // Unmarshal Root Level JsonArray
            JsonArray 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 JsonObject
            JsonObject 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());
            }
        }
    }

}


输入的JSON:
[
    {
        "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"
            }
        ]
    }
]

输出结果:

Jane


2 Bob


3 555-2222


4 555-3333
同时可以参考偶的译文:
http://developer.51cto.com/art/201306/399778.htm
3
2
分享到:
评论

相关推荐

    eclipse-java-2023-12-R-win32-x86-64.zip

    eclipse-java-2023-12-R-win32-x86_64.zip 适用于Windows系统

    eclipse-java-2021-06-R-win32-x86_64

    【标题】"eclipse-java-2021-06-R-win32-x86_64" 提供的是Eclipse IDE(集成开发环境)的一个特定版本,专为Java开发者设计,适用于Windows操作系统32位x86_64架构。这个版本是在2021年6月发布的,通常称为R版本,...

    json-lib-2.4-jdk15和全部依赖jar包

    JSON库如`json-lib`则提供了将Java对象转换为JSON格式和从JSON字符串反序列化为Java对象的功能。`json-lib-2.4-jdk15`是JSON库的一个特定版本,专为JDK 1.5设计,确保在该环境下能够正常运行。 `json-lib`库主要...

    json-lib-2.4-jdk15.jar和其他关联的jar包

    `json-lib-2.4-jdk15.jar`是JSON库的一个实现,主要用于Java开发环境,它提供了将Java对象转换为JSON格式以及从JSON字符串还原Java对象的功能。 `json-lib`项目是一个开源库,旨在为各种Java平台提供JSON支持。版本...

    eclipse-java-mars-2-win32-x86_64

    "eclipse-java-mars-2-win32-x86_64"这个标题明确地指出了它的平台适应性和版本信息,让我们深入了解一下这个强大的工具。 Eclipse Mars 2的发布标志着Eclipse社区对Java开发的持续承诺和创新。Mars是Eclipse的一个...

    eclipse-java-2020-06-R-win32-x86_64.zip

    "eclipse-java-2020-06-R-win32-x86_64.zip" 是Eclipse针对Java开发者的2020年6月发布的最新版本,特别为64位Windows操作系统设计。此版本包含了基础的Java开发工具,适用于Java Standard Edition (JavaSE)的应用...

    eclipse-java-2020-03-R-win32-x86-64

    标题 "eclipse-java-2020-03-R-win32-x86-64" 暗示我们正在讨论的是一个适用于Windows操作系统(64位)的Eclipse IDE版本,具体为2020-03发布版。Eclipse是一款开源的集成开发环境(Integrated Development ...

    json-lib-2.4-jdk15.jar所需全部JAR包_JSON_

    这些依赖包可能包含对基础库如XML解析器、反射API或者其他核心功能的支持。当描述中提到“json-lib-2.4-jdk15.jar所需全部JAR包”时,这意味着为了使这个库能正常工作,还需要下载和包含一系列其他的JAR文件。 这些...

    java 使用json-rpc

    JSON-RPC for Java是一种基于JSON(JavaScript Object Notation)协议的远程过程调用(Remote Procedure Call)框架,它允许客户端通过网络调用服务器上的方法,实现了客户端与服务器端的轻量级通信。本文将详细解释...

    eclipse-java-indigo-SR2-win32

    综上所述,"eclipse-java-indigo-SR2-win32"是一个专门为Windows 32位系统设计的Eclipse IDE版本,它包含了对Java开发的强大支持,并且集成了FindBugs、PMD和Checkstyle等代码质量管理工具,旨在提供一个高效、稳定...

    eclipse-java-2021-12-R-macosx-cocoa-x86_64.dmg

    Eclipse IDE for Java Developers (eclipse-java-2021-12-R-macosx-cocoa-x86_64.dmg)适用于macOS x86_64

    eclipse-java-2019-09-R-win32-x86_64.zip

    它支持JDK的最新版本,使得开发者能够利用最新的Java特性和API进行开发。 3. **2019-09-R**: "2019-09"表示这个版本发布于2019年的第三个开发周期,即九月。"R"代表Release,表明这是一个稳定版本,经过了充分的...

    json所有的jar包下载

    json-lib-2.2.3-jdk15.jar commons-beanutils-1.7.0.jar commons-httpclient-3.1.jar commons-lang-2.3.jar commons-logging-1.1.1.jar commons-collections-3.2.1.jar ezmorph-1.0.3.jar 如果不关联这些包,则会...

    json所需jar包 例如json-lib-2.2-jdk15等

    `json-lib`是一个Java语言实现的JSON库,支持多种Java数据类型与JSON之间的转换,包括数组、集合、日期等。 标题中提到的`json-lib-2.2-jdk15`是`json-lib`的一个版本,专为JDK 1.5设计。这个库使得Java开发者能够...

    eclipse-java-helios-SR2-win32(1/2)

    eclipse-java-helios-SR2-win32(1/2)

    eclipselink的英文文档

    - **EclipseLink核心和API**:提供了对EclipseLink核心API的概述。 - **对象关系组件**:专为JPA 2.1设计,提供了对Java持久化API的支持。 - **JAXB组件**:用于将Java类绑定到XML表示。 - **MOXy组件**:提供对象...

    eclipse-java-2021-06-R-macosx-cocoa-x86_64.dmg

    Eclipse IDE for Java Developers 适用于macOS x86_64

    Eclipse32位4.4月亮版eclipse-java-luna-SR2-win32.zip支持jdk1.7

    Eclipse32位4.4月亮版eclipse-java-luna-SR2-win32.zip支持jdk1.7 Eclipse 支持jdk1.7 32位 luna 月亮版 eclipse-java-luna-SR2-win32.zip 更多eclipse版本可看查看我的系列,欢迎下载~

    eclipse-java-mars-2-linux-gtk-x86_64.tar.gz

    "eclipse-java-mars-2-linux-gtk-x86_64.tar.gz" 是Eclipse针对Linux操作系统的一个特定版本,这个版本是基于GTK+图形库的64位构建。 Mars是Eclipse的4.5版本代号,发布于2015年,它包含了一系列新特性和改进,旨在...

    java实现体温单实例-eclipse-java工程

    总的来说,这个“java实现体温单实例-eclipse-java工程”涵盖了Java基础、面向对象编程、数据结构、GUI编程和测试等多个方面。通过学习这个实例,开发者不仅可以掌握Java编程的基本技能,还能了解到如何在Eclipse中...

Global site tag (gtag.js) - Google Analytics