RESTスタイルのAPIを作成するために、JSONとXMLの間で変換したいオブジェクトグラフがあります。誰かがすでにこれを行っているに違いないが、GoogleとStack Overflowを使用したクイック検索では何も明らかになりません。
これを行うのに適した(Apacheまたは同等のライセンスが望ましい)ライブラリを知っている人はいますか?
[〜#〜] gson [〜#〜]googleから: http://code.google.com/p/google- gson / 、
または
Jackson春に使用されたライブラリ: https://github.com/FasterXML/jackson
そして私は、XMLをjajobからpojoに提案する他の人たちにも同意するでしょう。
POJOからXMLの場合、 [〜#〜] jaxb [〜#〜] を使用することをお勧めします(たとえば、XStreamなどの他のライブラリもありますが、JAXBは標準化されています)。
JSONについては何も知りませんが、RESTful APIを実装したい場合は、RESTful APIのサーバー側APIを定義する JSR-311 に興味があるかもしれません Jersey は、そのリファレンス実装です。
XMLにはXstream http://x-stream.github.io/ を使用し、JSONにはJSON http://www.json.org/Java/ を使用します。両方を行う1つのライブラリーがあるとは思わない。
または、必要に応じてXStreamレンダラー/ JSONレンダラーに委譲するラッパーを記述します。
注:私は EclipseLink JAXB(MOXy) リードおよび JAXB(JSR-222) 専門家グループのメンバー。
EclipseLink JAXB(MOXy)は、単一のオブジェクトモデルを同じメタデータを持つXMLとJSONの両方にマッピングすることをサポートします。
ライセンス情報
ドメインモデル
以下は、この例で使用するドメインモデルです。この例では、Java SE 6以降にJDK/JREで使用できる標準のJAXB(JSR-222)アノテーションを使用しています。
お客様
package forum658936;
import Java.util.List;
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {
String firstName;
@XmlElement(nillable=true)
String lastName;
@XmlElement(name="phone-number")
List<PhoneNumber> phoneNumbers;
}
PhoneNumber
package forum658936;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
public class PhoneNumber {
@XmlAttribute
int id;
@XmlValue
String number;
}
jaxb.properties
MOXyをJAXBプロバイダーとして指定するには、jaxb.properties
というファイルをドメインモデルと同じパッケージに次のエントリで含める必要があります(参照: http://blog.bdoughan.com/2011/ 05/specifying-eclipselink-moxy-as-your.html )。
javax.xml.bind.context.factory=org.Eclipse.persistence.jaxb.JAXBContextFactory
[〜#〜] xml [〜#〜]
input.xml
これは、デモコードが読み取ってドメインオブジェクトに変換するXMLです。
<?xml version="1.0" encoding="UTF-8"?>
<customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<firstName>Jane</firstName>
<lastName xsi:nil="true"/>
<phone-number id="123">555-1234</phone-number>
</customer>
XMLに関する注意事項:
xsi:nil
属性は、lastName
がnullであることを示すために使用されます。phone-number
要素は、単純なコンテンツを持つ複雑なタイプです(次を参照してください http://blog.bdoughan.com/2011/06/jaxb-and-complex-types-with-simple.html =)。[〜#〜] json [〜#〜]
出力
以下は、デモコードを実行して出力されたJSONです。
{
"firstName" : "Jane",
"lastName" : null,
"phone-number" : [ {
"id" : 123,
"value" : "555-1234"
} ]
}
JSONに関する注意事項:
null
値は、lastName
がnullであることを表すために使用されます。 xsi:nil
属性が存在しません。property
のint
は、引用符なしで正しくマーシャリングされました。id
は属性でしたが、JSON表現では特別に表現する必要はありません。デモコード
以下のデモコードでは、XMLドキュメントをオブジェクトに変換し、同じインスタンスをJSONに変換します。
デモ
MOXyはJAXBアノテーションを解釈するだけでなく、JAXB実装であるため、標準のJAXBランタイムAPIが使用されます。 JSONバインディングは、Marshaller
でMOXy指定プロパティを指定することで有効になります。
package forum658936;
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/forum658936/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.org Java section
Json-lib は、Apache 2.0ライセンスの下でライセンスされています。
JSONオブジェクトをXMLに変換することもできますが、POJOを最初にそれを介してJSONに変換する必要があります。
個人的には、この2つに個別に取り組みます。そして、JSON <-> XMLをJSON <-> Pojo <-> XMLで変換します。
こうすることで、Java <-> POJO with JAXB( http://jaxb.dev.Java.net ;また、JDK 1.6にもバンドルされています)と注釈(XStreamも可)が含まれます。 JSONの場合、JacksonのObjectMapper( http://jackson.codehaus.org/Tutorial )。ジャージーでうまく動作し、私はそれを自分で使用しています(現在のジャージーバージョンには、デフォルトで完全なPojoデータバインディングがバンドルされていませんが、近い将来に組み込まれます)
私は実際には「json」を生成するためにどのxmlライブラリーも使用しません。XStreamおよびJAXB/Jettisonは一種のJSONを生成できますが、直感的ではない醜い規則を使用しています。
編集(2011年7月18日):ジャクソンには、JAXBのように、XMLの読み取り/書き込みが可能な「 jackson-xml-databind 」という拡張機能が実際にあります。したがって、JSONとXMLの両方で、POJOとの間で使用できます。
ほぼ文字通り数百があります。私のお気に入りは、POJO <-> JSONのGSONとPOJO <-> XMLのcastor-xmlです。
おまけとして、どちらもApache License 2.0スタイルのライセンスの下でライセンスされます。
最後にウェブサイトで見た、XStreamは両方を行います。シリアル化のターゲットとしてXMLとJSONをサポートします。