2011-06-27 8 views
3

私にはコントロールがなく、あらかじめ作成されたJavaオブジェクトにマップするJSONオブジェクトがあります。 JSONオブジェクトには、URLとなる属性またはJSONArrayの属性が1つあります。以下はジャクソンJSONから異なるデータ型の同じattrubuteのJavaマッピングへ

Class SomeClass { 

    private URL items; 

    public URL getURL() { 
     return items; 
    } 

    public void setURL(URL url) { 
     this.items = url; 
    } 
} 

JSONです:

ケースA:

{ 
... 
    items: http://someurl.abc.com/linktoitems, 
... 
} 

OR

ケースB

{ 
... 
    items: [ 
      { "id": id1, "name": name1 }, 
      { "id": id2, "name": name2 } 
      ] 
... 
} 

私はケースAのためにマッピングするためにPOJOを作成した場合ケースBは失敗し、逆もまた同様である。つまり、JSON属性を異なるデータ型のPOJOフィールドにマップする方法はありますか?その場合、私はそれが正確な詳細に依存しますが、JavaプロパティにJSON文字列またはJSON配列のいずれかをマッピングすることが可能であるならば何を求めていることであるならばという名前のPOJOに2つの別々のフィールド、

private URL itemLink; 
private Item[] itemList; 

答えて

2

を作成します。はい、これを行うことができます。

明らかに、JSON入力の両方の種類を処理するカスタムデシリアライザを定義することです。 しかし、Javaの型を定義することもできます。これは、JSONオブジェクトから機能するプロパティを設定し、単一のString-argコンストラクタまたはstatic single-String-argファクトリメソッドを@JsonCreator。

さらに別の方法として、任意のJSONからデシリアライズできる中間タイプを使用することができます。java.lang.ObjectインスタンスとJsonNode( "JSONツリー")インスタンスは、任意のJSONから作成できます。この値から、手動で変換する必要があります。おそらくセッターでそうです:

public void setItems(JsonNode treeRoot) { .... } 

ただし、動作しないのは、同じ名前の2つのプロパティを定義することです。

私がまったく行っていないことの1つは、リストからURLへの変換方法です。実際には2つの別々の内部フィールドが必要になることがあります。 setterはそれらのいずれかに代入します(getterはただ1つの値を返します)。

+0

返信いただきありがとうございます。しかし、私は手動でキーのデータ型を特定し、その値を適切なオブジェクト(URLまたはList)に割り当てています。 – user788052

関連する問題