2011-10-25 10 views
4

Javaには、JavaオブジェクトをXMLにマップし戻すいくつかのXMLバインディング・フレームワークがあります。これらのフレームワークでは、さまざまなJava階層とクラスを選択したXML構造にマップできます。それらは、別の構成ファイルを使用して構成できます。これらのフレームワークには、Castor、JiBXなどが含まれます。他のフレームワークはプログラムで構成することができます。Javaの複数のjsonバインディング

ほとんどのJSONバインディングフレームワークは、Javaオブジェクトをjsonに直接マップするだけです。大部分は、複雑なJava階層を任意のJSONオブジェクト表現にマッピングする柔軟性を拡張していません。設定は通常かなり制限されています。

私は現在、jsonレスポンスを返すWebサービスを構築しようとしています。私のJavaドメインクラスが何らかの形で変わった場合、私のjsonレスポンスも同様に変化し、古いバージョンのjsonレスポンスを期待しているサービスクライアントが壊れてしまいます。

複数のバインディングを同じクラスセットにマップできる完全に柔軟なJSONバインディングフレームワークはありますか?

(おそらくもっと根本的な質問です)同じJavaクラスのセットで異なるバージョンのJSONバインディングをサポートするにはどうすればよいですか?

ドメインクラスが決して変更されないようにしてください。 (これは実現可能ではない)

答えて

0

良い質問私はもう少し大規模に自分自身と取り組んでいます。

問題は、オブジェクトのシリアル化によってカプセル化が中断されることです。しかし、それはUIに表示されます。しかし、もしあなたがそれをしなければ、何が良いのですか?

私が思いついた唯一の解決策は、ビューオブジェクトを作成することです。ビュー・オブジェクトには、実際の処理を行うために必要なプライベート・データを使用せずに、データのビュー部分の外部化を可能にするゲッタとセッタがあります。

問題は、いくつかの重複したコーディングが必要になることですが、長期的なアーキテクチャ上の問題を防ぐように思われます。

私はもっと役に立たないが、これはソフトウェアエンジニアが永遠に苦労する厄介な問題の1つに過ぎない。

My $ .02。

+0

私は、resを生成するために完全に異なるビュークラスを作成することは標準的な方法ではないと思いますポンセ形式。たとえば、JiBXでは、複数のXML構造を1つのクラスにバインドできます。特定のバインディング名を指定すると、Javaクラスは異なるXML構造にマーシャリングされます。それはかなり素晴らしいです! 私は、同じクラスに複数のJSON構造体をバインドできる同等のJSONフレームワークを探しています。誰もが知っている? – onejigtwojig

1

JAX-RS(Java API for RESTful Webservices)と組み合わせてJAXBを使用している場合、これは簡単です。 JAX-RS(あるいは少なくともJersey、JAX-RSの実装を参照)JAXB注釈を理解し、それだけ、たとえば、あなたのWebサービスメソッドのメディアタイプを変更する必要がある代わりに、XMLの出力JSONにする:

@GET @Path("{customerId}") 
@Produces(MediaType.TEXT_XML) // Change this to MediaType.APPLICATION_JSON 
public Customer getCustomer(@PathParam("customerId") String customerId) { 
    // ... 
} 

Customerは、JAXBマッピングアノテーション(注釈付きの他のクラスなどを参照する可能性があります)を使用してアノテーション付けされたクラスです。

2

注:私はEclipseLink JAXB (MOXy)リードだし、JAXB 2 (JSR-22)専門家グループのメンバー。

EclipseLink 2.4のMOXyコンポーネントには、探しているタイプのJSONバインディングが含まれます。以下の例では、AddressオブジェクトはGoogle's Geocoding API V2の応答にマップされています。この例は、パスベースのマッピングがクラスとJSON構造の間の密接な関係の必要性を排除する方法を示しています。

package blog.geocode.json; 

import javax.xml.bind.annotation.XmlType; 
import org.eclipse.persistence.oxm.annotations.XmlPath; 

@XmlType(propOrder={"country", "state", "city", "street", "postalCode"}) 
public class Address { 

    @XmlPath("Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:Locality/ns:Thoroughfare/ns:ThoroughfareName/text()") 
    private String street; 

    @XmlPath("Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:Locality/ns:LocalityName/text()") 
    private String city; 

    @XmlPath("Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:AdministrativeAreaName/text()") 
    private String state; 

    @XmlPath("Placemark/ns:AddressDetails/ns:Country/ns:CountryNameCode/text()") 
    private String country; 

    @XmlPath("Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:Locality/ns:PostalCode/ns:PostalCodeNumber/text()") 
    private String postalCode; 

} 

あなたが別のマッピングドキュメントオブジェクトモデルに複数のマッピングを適用するための鍵である持っ言及したよう。

をあなたはマイルストーンのいずれかを使用して、今日出て結合JSONを試すことができます構築します:

+0

json構造にバインドする例がありますか? – onejigtwojig

+0

次の例では、JSON構造にマップする方法を示します。http://blog.bdoughan.com/2011/08/json-binding-with-eclipselink-moxy.htmlこの例では、同じメタデータを使用する方法を示していますJSONとXMLの両方にマップする:http://blog.bdoughan.com/2011/08/binding-to-json-xml-geocode-example.html –

関連する問題