Converting Java Object to Json using Marshaller

匿名 (未验证) 提交于 2019-12-03 01:06:02

问题:

Its quite easy to convert a java object to XML by using Marshaller. But I need to convert a java object to JSON by using marshaller alone. I know its good to use gson or Xstream like things., but I need to do using Marshaller.How to achieve it?

Thanks in advance.

回答1:

Note: I'm the EclipseLink JAXB (MOXy) lead and a member of the JAXB (JSR-222) expert group,

Below is how this can be done if you are using MOXy as your JAXB provider.

JAVA MODEL

Customer

import java.util.*; import javax.xml.bind.annotation.*;  @XmlRootElement(namespace="http://www.example.com") @XmlType(namespace="http://www.example.com") @XmlAccessorType(XmlAccessType.FIELD) public class Customer {      @XmlAttribute     private int id;      @XmlElement(namespace="http://www.example.com")     private String firstName;      @XmlElement(namespace="http://www.example.com", nillable=true)     private String lastName;      @XmlElement(namespace="http://www.example.com")     private List phoneNumbers = new ArrayList();  } 

PhoneNumber

import javax.xml.bind.annotation.*;  @XmlAccessorType(XmlAccessType.FIELD) public class PhoneNumber {      @XmlAttribute     private String type;      @XmlValue     private String number;  } 

jaxb.properties

To specify MOXy as your JAXB provider you need to include a file called jaxb.properties in the same package as your domain model with the following entry (see: http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html)

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

DEMO CODE

input.xml

Jane555-1111

Demo

In the demo code below we will use the same JAXB metadata to convert an XML document to Java objects, and then convert those objects back to JSON. With MOXy you can specify JSON output by setting a property on the Marshaller.

import java.io.File; import javax.xml.bind.*; import org.eclipse.persistence.jaxb.MarshallerProperties;  public class Demo {      public static void main(String[] args) throws Exception {         JAXBContext jc = JAXBContext.newInstance(Customer.class);          Unmarshaller unmarshaller = jc.createUnmarshaller();         File xml = new File("src/forum15357366/input.xml");         Customer customer = (Customer) unmarshaller.unmarshal(xml)                 ;         Marshaller marshaller = jc.createMarshaller();         marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);         marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json");         marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, false);         marshaller.marshal(customer, System.out);     }  } 

JSON Output

Below is the JSON output. Note how there are no indicators corresponding to namespaces or XML attributes. Also note the collection of size one was correctly represented as a JSON array (a problem with some other approaches).

{    "id" : 123,    "firstName" : "Jane",    "lastName" : null,    "phoneNumbers" : [ {       "type" : "work",       "value" : "555-1111"    } ] } 


回答2:

JsonMarshaller is a Java 1.5 library that allows marshalling and unmarshalling of JSON objects to and from Java objects. This project's goal is above all ease of use, transparency and static type safety. Example

If you have the following Java class:

JAVA:

@Entity class Book { @Value   private String title; @Value   private String isbn; @Value   private Set authors; }  @Entity class Author { @Value   private String firstName; @Value   private String lastName; } 

and you created a new Book() and populated it with info it could marshal too:

JSON:  {title:   "java",  isbn:    "122333",  authors: [{firstName: "Herbert", lastName: "Shield"},            {firstName: "Pascal",  lastName: "Perez"}]} 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!