moxy json介紹
GlassFish 4現在可以提供完整的Java EE 7(JSR-342)平臺。 EclipseLink為該發行版做出了一些重大貢獻。 首先是提供JPA 2.1(JSR-338)實現。 我將在本文中介紹的第二個內容是EclipseLink MOXy,它現在是JAX-RS應用程序的默認JSON綁定提供程序。
RESTful服務
客戶服務
通常,JPA將支持真實的服務來執行持久性操作(請參閱: 創建RESTful Web服務–第4/5部分 )。 但是對于這篇文章,我將使用“ Hello World”
樣式服務,該服務基于ID作為XML和JSON返回一個Customer ,以說明有關綁定的一些要點。
package org.example.service;import javax.ejb.*;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import org.example.model.*;@Stateless
@LocalBean
@Path("/customers")
public class CustomerService {@GET@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})@Path("{id}")public Customer read(@PathParam("id") int id) {Customer customer = new Customer();customer.setId(id);customer.setName("Jane Doe");PhoneNumber pn = new PhoneNumber();pn.setType("work");pn.setValue("5551111");customer.getPhoneNumbers().add(pn);return customer;}}
客戶申請
我使用了Application類來指定服務的路徑。
package org.example.service;import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;@ApplicationPath("rest/*")
public class CustomerApplication extends Application {}
Java模型
以下是我們用于此示例的Java模型。 目標是使用一組元數據生成良好的XML和JSON表示形式。
顧客
關于Customer類,有幾點有趣的事情要注意。
id屬性是一個int 。 由于JSON具有不同的數字和文本表示方式,因此我們將研究如何在JSON輸出中表示該值。 phoneNumbers屬性的類型為List <PhoneNumber> 。 已使用@XmlElementWrapper對其進行注釋,以產生良好的XML輸出。 我們將研究這樣做對JSON輸出的影響。 package org.example.model;import java.util.*;
import javax.xml.bind.annotation.*;@XmlRootElement
public class Customer {private int id;private String name;private List<PhoneNumber> phoneNumbers = new ArrayList<PhoneNumber>();public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@XmlElementWrapper@XmlElement(name="phoneNumber")public List<PhoneNumber> getPhoneNumbers() {return phoneNumbers;}}
電話號碼
在XML中, PhoneNumber類映射到具有簡單內容的復雜類型(請參閱: JAXB和具有簡單內容的復雜類型 )。 這意味著它將映射到具有屬性和文本的XML元素。 這些XML概念并不直接與JSON概念相對應,因此我們將研究JSON表示形式。
package org.example.model;import javax.xml.bind.annotation.*;public class PhoneNumber {private String type;private String value;@XmlAttributepublic String getType() {return type;}public void setType(String type) {this.type = type;}@XmlValuepublic String getValue() {return value;}public void setValue(String value) {this.value = value;}}
使用服務
要求– GET
以下是我們用于訪問服務的URL:
http://localhost:8080/CustomerResource/rest/customers/1
響應(應用程序/ xml)
由于我們將域模型映射為
JAXB(JSR-222)元數據下面的XML表示并不奇怪。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer id="1"><name>Jane Doe</name><phoneNumbers><phoneNumber type="work">5551111</phoneNumber></phoneNumbers>
</customer>
響應(應用程序/ json)– GlassFish 3.1.2
讓我們看看在MOXy是默認的JSON綁定提供程序之前,GlassFish 3.1.2中的JSON表示是什么樣的。 有幾件事要注意:
id屬性的int值表示為JSON文本。 類型為List <PhoneNumber>的phoneNumbers屬性
因為它只有一個項目被表示為JSON對象而不是JSON數組。 同樣,即使此鍵包含一個集合,它仍稱為phoneNumber 。 自類型屬性使用@XmlAttribute注釋以來,與type屬性相對應的JSON關鍵字以@ 開頭 。 自從使用@XmlValue進行注釋以來,與value屬性對應的JSON密鑰稱為$ 。 {"id": "1","name": "Jane Doe","phoneNumbers": {"phoneNumber": {"@type": "work","$": "5551111"}}
}
響應(應用程序/ json)– GlassFish 4
使用默認配置,您將看到升級到GlassFish 4消除了兩個最大的問題:
數值–現在, id屬性已作為數字值正確編組到JSON。 這不是技巧,MOXy將JSON表示形式基于屬性的Java類型。 PhoneNumber實例上的String類型的value屬性僅包含數字,并且已作為文本正確編組到JSON。 大小為1的集合–現在, phoneNumber鍵是一個JSON數組,不幸的是,它仍稱為phoneNumber (我將在下一步演示如何解決此問題)。 {"id": 1,"name": "Jane Doe","phoneNumbers": {"phoneNumber": ["@type": "work","$": "5551111"]}
}
自定義JSON綁定
現在可以通過利用JAX-RS ContextResolver機制來配置MOXy。 您只需要返回MOXyJsonConfig的實例。 我們將使用它來執行以下操作:
指定我們不想為與@XmlAttribute映射的屬性相對應的JSON關鍵字添加前綴。 使用JSON關鍵值 ,而不是$與@XmlValue映射屬性。 MOXyJsonConfig也可以用于將屬性向下傳遞給Marshaller / Unmarshaller。 我們將執行此操作以清理集合屬性的JSON密鑰(請參閱: 綁定到JSON&XML –處理集合 )。 package org.example.service;import javax.ws.rs.ext.*;
import org.eclipse.persistence.jaxb.JAXBContextProperties;
import org.glassfish.jersey.moxy.json.MoxyJsonConfig;@Provider
public class MOXyJsonContextResolver implements ContextResolver<MoxyJsonConfig> {private final MoxyJsonConfig config;public MOXyJsonContextResolver() {config = new MoxyJsonConfig().setAttributePrefix("").setValueWrapper("value").property(JAXBContextProperties.JSON_WRAPPER_AS_ARRAY_NAME, true);}@Overridepublic MoxyJsonConfig getContext(Class<?> objectType) {return config;}}
新回應
最后,我們有一個我們可以滿意的JSON表示形式。 它不包含任何與XML相關的工件,即使它是使用與XML表示相同的元數據生成的(未更改)。 只需要一點點MOXy。
{"id": 1,"name": "Jane Doe","phoneNumbers": [{"type": "work","value": "5551111"}]
}
參考: MOXy是GlassFish 4中新的默認JSON綁定提供程序,來自我們的JCG合作伙伴 Blaise Doughan,來自Java XML&JSON Binding博客。
翻譯自: https://www.javacodegeeks.com/2013/06/moxy-is-the-new-default-json-binding-provider-in-glassfish-4.html
moxy json介紹
總結
以上是生活随笔為你收集整理的moxy json介绍_MOXy是GlassFish 4中新的默认JSON绑定提供程序的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。