web-dev-qa-db-ja.com

Java POJOをJSONおよびXMLとの間で変換するライブラリはありますか?

RESTスタイルのAPIを作成するために、JSONとXMLの間で変換したいオブジェクトグラフがあります。誰かがすでにこれを行っているに違いないが、GoogleとStack Overflowを使用したクイック検索では何も明らかになりません。

これを行うのに適した(Apacheまたは同等のライセンスが望ましい)ライブラリを知っている人はいますか?

30
Darren Hague

[〜#〜] gson [〜#〜]googleから: http://code.google.com/p/google- gson /

または

Jackson春に使用されたライブラリ: https://github.com/FasterXML/jackson

そして私は、XMLをjajobからpojoに提案する他の人たちにも同意するでしょう。

14
NimChimpsky

POJOからXMLの場合、 [〜#〜] jaxb [〜#〜] を使用することをお勧めします(たとえば、XStreamなどの他のライブラリもありますが、JAXBは標準化されています)。

JSONについては何も知りませんが、RESTful APIを実装したい場合は、RESTful APIのサーバー側APIを定義する JSR-311 に興味があるかもしれません Jersey は、そのリファレンス実装です。

11
Joachim Sauer

XMLにはXstream http://x-stream.github.io/ を使用し、JSONにはJSON http://www.json.org/Java/ を使用します。両方を行う1つのライブラリーがあるとは思わない。

または、必要に応じてXStreamレンダラー/ JSONレンダラーに委譲するラッパーを記述します。

6
Kannan Ekanath

注:私は 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に関する注意事項:


[〜#〜] json [〜#〜]

出力

以下は、デモコードを実行して出力されたJSONです。

{
   "firstName" : "Jane",
   "lastName" : null,
   "phone-number" : [ {
      "id" : 123,
      "value" : "555-1234"
   } ]
}

JSONに関する注意事項:

  • null値は、lastNameがnullであることを表すために使用されます。 xsi:nil属性が存在しません。
  • 電話番号のコレクションはサイズ1であり、角かっこで正しく囲まれています。多くのライブラリは、サイズ1のコレクションを誤ってJSONオブジェクトとして扱います。
  • タイプpropertyintは、引用符なしで正しくマーシャリングされました。
  • XML表現では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);
    }

}
3
bdoughan

私はあなたがここにあるものに似たものを探していると思います: JSON.org Java section

3
Mr. Will

Json-lib は、Apache 2.0ライセンスの下でライセンスされています。

JSONオブジェクトをXMLに変換することもできますが、POJOを最初にそれを介してJSONに変換する必要があります。

1
Powerlord

個人的には、この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との間で使用できます。

1
StaxMan

ほぼ文字通り数百があります。私のお気に入りは、POJO <-> JSONのGSONとPOJO <-> XMLのcastor-xmlです。

おまけとして、どちらもApache License 2.0スタイルのライセンスの下でライセンスされます。

0
Mikkel Løkke

最後にウェブサイトで見た、XStreamは両方を行います。シリアル化のターゲットとしてXMLとJSONをサポートします。

0
Jay R.