moxy json介绍_通过MOXy实现使您的JAXB更清洁
moxy json介紹
編組和解組XML時(shí)使用JAXB的主要優(yōu)點(diǎn)是編程模型。 只需注釋幾個(gè)POJO并使用JAXB API,您就可以很容易地序列化為XML和從XML反序列化。 您無需擔(dān)心有關(guān)XML如何編組/解組的細(xì)節(jié)。 一切都比DOM和SAX等替代方案簡(jiǎn)單得多。現(xiàn)在,XML文件中的數(shù)據(jù)本質(zhì)上趨于分層。 例如,考慮以下XML文件:
<?xml version="1.0" encoding="UTF-8"?> <person><firstname>Barok</firstname><lastname>Obama</lastname><age>52</age><car><model>Green Ford Focus 1.4L</model></car> </person>在這種情況下,Barok Obama人擁有的汽車是Green Ford Focus。 在這里,我們看到了XML的層次結(jié)構(gòu)特征。 車在人下。 在一個(gè)更復(fù)雜的示例中,一個(gè)人可以擁有一個(gè)汽車,該汽車具有一個(gè)汽車收音機(jī),該汽車具有一個(gè)放大器,該汽車具有晶體管等。但是,讓我們暫時(shí)堅(jiān)持我們的簡(jiǎn)單情況。 假設(shè)我們要使用JAXB解組該XML文件。 我們需要所有人的詳細(xì)信息(名字,姓氏等)以及屬于該人的汽車的型號(hào)。 我們創(chuàng)建一個(gè)Person POJO和Car POJO并進(jìn)行適當(dāng)?shù)淖⑨尅?
@XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) @XmlType(propOrder={"name", "firstname", "lastname"}) public class Person {private String firstname;private String lastname;private int age;private Car car;public String getLastname() {return lastname;}public void setLastname(String lastname) {this.lastname = lastname;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getFirstname() {return firstname;}public void setFirstname(String name) {this.firstname = name;}public Car getCar() {return car;}public void setCar(Car car){this.car= car;} }public class Car {private String model;public String getModel() {return model;}public void setModel(String model){this.model = model;} }要解組,我們只需做
public static void unmarshall() throws Exception {JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();Person person = (Person)unmarshaller.unmarshal(new File("Person.xml"));System.out.println("Perosn is=" +person.toString()); }這一切看起來非常簡(jiǎn)單-特別是當(dāng)您考慮到Car實(shí)體甚至不需要任何注釋時(shí)! 但是,Car僅具有一個(gè)屬性,為我們只希望從中獲得一個(gè)屬性的東西而擁有POJO類似乎有點(diǎn)過頭了! 記住,這是一個(gè)簡(jiǎn)單的示例,想象一下層次結(jié)構(gòu)是否更深。 類似于包含實(shí)體的外部實(shí)體,其中包含另一個(gè)實(shí)體,該實(shí)體甚至包含另一個(gè)實(shí)體,而我們所需的只是外部實(shí)體和來自最深層嵌套實(shí)體的一個(gè)屬性。 本質(zhì)上是相同的問題,但更多的是矯kill過正。 我們必須確保在層次結(jié)構(gòu)中的所有內(nèi)容上都有POJO類,甚至對(duì)于我們不需要的實(shí)體也是如此。 沒有人喜歡代碼膨脹。 所以,我們能做些什么?
好吧,我們要記住的第一件事是,JAXB是一個(gè)規(guī)范,該規(guī)范有許多實(shí)現(xiàn)(例如JaxMeAPI,MOXy,Metro)。 如果我們要使用JAXB參考實(shí)現(xiàn)(隨JDK一起提供,則無能為力)。 我們必須有一個(gè)汽車和人POJO。 但是,如果我們使用EclipseLink的MOXy實(shí)現(xiàn),則可以使用其一些擴(kuò)展來幫助我們。 更具體地說,我們可以使用受XPath啟發(fā)的MOXy @XmlPath擴(kuò)展。
讓我們來看看它的作用。 這是更新的Person POJO。
@XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) @XmlType(propOrder={"name", "firstname", "lastname"}) public class Person {private String firstname;private String lastname;private int age;public String getLastname() {return lastname;}public void setLastname(String lastname) {this.lastname = lastname;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getFirstname() {return firstname;}public void setFirstname(String name) {this.firstname = name;}@XmlPath("car/model/text()")private String model;public String getModel() {return model;} } 那么,汽車POJO哪里去了? 好吧,它被刪除了。 我們不再需要它了。 再見。
使用MOXy @XmlPath批注,我們不需要Car POJO。 該批注駐留在org.eclipse.persistence.oxm.annotations包中,將其放在類路徑中確實(shí)很簡(jiǎn)單。 如果您是maven用戶,只需添加:
為了告訴您的JDK在運(yùn)行時(shí)將MOXy用于JAXB實(shí)現(xiàn),您放置了一個(gè)名為
jaxb.properties與您的JAXB POJO位于同一目錄中。 它包含一行:
為了確保您正在使用MOXy實(shí)現(xiàn),只需檢查JAXB上下文:
JAXBContext jaxbContext = JAXBContext.newInstance(Person.class); System.out.println("jaxbContext is=" +jaxbContext.toString());您應(yīng)該看到類似以下內(nèi)容:
jaxbContext is=org.eclipse.persistence.jaxb.JAXBContext@5e3974 之后,沒有任何變化。 完全相同的數(shù)據(jù)編碼都可以使用。
我之所以喜歡此擴(kuò)展的原因之一是因?yàn)樗馕吨俚拇a。 這通常意味著更簡(jiǎn)潔的代碼和更多可維護(hù)的代碼。 這在更復(fù)雜的情況下變得更加明顯,在這種情況下,實(shí)體的層次結(jié)構(gòu)比該簡(jiǎn)單示例要深得多。 如果使用諸如XJC之類的東西來生成POJO沒關(guān)系,您仍然會(huì)感到代碼膨脹。
請(qǐng)記住,JAXB被設(shè)置為比JAX替代品(例如SAX和DOM)更簡(jiǎn)潔的編程模型,但是在具有深層次結(jié)構(gòu)的場(chǎng)景中,使用JAXB對(duì)類進(jìn)行概要分析并不能使它令人信服地更加簡(jiǎn)潔。 請(qǐng)記住,使用DOM和XPath甚至僅使用SAX來忽略不需要的類將非常容易。
MOXy通過提供對(duì)XML文件中的任何內(nèi)容使用XPath表達(dá)式的能力,將清潔的戰(zhàn)斗帶回到了JAXB。
注意:MOXy剛剛作為WebLogic 12c的JAXB實(shí)現(xiàn)包含在內(nèi)。
參考文獻(xiàn):
相關(guān)文章 :
- 使用JAXB從XSD生成XML
- 重用生成的JAXB類
- 將對(duì)象映射到多個(gè)XML模式–天氣示例
- JAXB,SAX,DOM性能
- 帶有簡(jiǎn)單框架教程的Android XML綁定
翻譯自: https://www.javacodegeeks.com/2012/01/make-your-jaxb-cleaner-with-moxy.html
moxy json介紹
總結(jié)
以上是生活随笔為你收集整理的moxy json介绍_通过MOXy实现使您的JAXB更清洁的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 喀喇怎么读 喀喇的读音
- 下一篇: 鲱鱼读音 鲱鱼正确读音