javascript
eclipselink_EclipseLink MOXy和用于JSON处理的Java API –对象模型API
eclipselink
用于JSON處理的Java API(JSR-353)是作為Java EE 7的一部分引入的用于生成和使用JSON的Java標準。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的JsonObjectBuilder和JsonArrayBuilder用于生成JsonObject和JsonArray的實例。 通過將MOXy包裝在MOXy的JsonObjectBuilderResult和JsonArrayBuilderResult實例中,我們可以使用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 JsonStructure ( JsonObject或JsonArray )解組。 要做到這一點只需換殲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
eclipselink
總結
以上是生活随笔為你收集整理的eclipselink_EclipseLink MOXy和用于JSON处理的Java API –对象模型API的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 哪个银行可以交燃气费
- 下一篇: 笔记本电脑下面菜单栏怎么还原(笔记本工具