私はJacksonを使用してWebアプリケーションへのjson呼び出しをマーシャリングしており、さまざまなオブジェクトを受け入れるメソッドを設計しようとしています。
例えば:
私は2つのクラス構造を持っています
{
name:"Joe",
surname:"Bloggs"
}
JavaクラスPersonに対応します
{
address1:"21 Main st",
city:"Georgetown",
zip:"12345"
}
Javaクラスアドレスに対応します
次に、これらのクラスのいずれかを次のように処理できる呼び出しを行います。
{
type:"Person",
data:{
name:"Joe",
surname:"Bloggs"
}
}
上記のリクエストをマップにマーシャリングする呼び出しを作成することも、オブジェクト構造ごとに1つずつ、2つの個別のリクエストを作成して、対応するクラスに直接マーシャリングすることもできます。
ジャクソンを使用して上記のリクエストをマップにマーシャリングし、マップの一部(例:map.get( "type"))を読み取った後、ジャクソンを使用してサブオブジェクト(例:map.get)をマーシャリングすることは可能ですか? ( "data")-jsonに再変換せずに、対応するJavaクラスに変換しますか?
ジャクソンポリモーフィズムを使用できます。簡単な例を次に示します。
public class Polymorphism3Main {
public static void main(String []args) throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(generatePerson());
System.out.println("json = " + json);
System.out.println(objectMapper.readValue(json, Request.class));
json = objectMapper.writeValueAsString(generateAddress());
System.out.println("json = " + json);
System.out.println(objectMapper.readValue(json, Request.class));
}
private static Person generatePerson() {
Person result = new Person();
result.setName("name");
result.setSurname("surname");
return result;
}
private static Address generateAddress() {
Address address = new Address();
address.setAddress1("address 1");
address.setCity("city");
address.setZip("324212");
return address;
}
}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
@JsonSubTypes({
@JsonSubTypes.Type(value = Person.class, name = "person"),
@JsonSubTypes.Type(value = Address.class, name = "address")
})
interface Request {
}
class Person implements Request {
private String name;
private String surname;
}
class Address implements Request {
private String address1;
private String city;
private String zip;
}
そのコードはわずかに異なるjsonを生成しますが、それでも問題ありません。
{"person":{"name":"name","surname":"surname"}}
{"address":{"address1":"address 1","city":"city","zip":"324212"}}
投稿したものとまったく同じjson形式にしたい場合は、ラッパーオブジェクトを作成する必要があります。
一般に、これら2つの要求を異なる方法で処理するために、2つの別個のメソッドを作成することをお勧めします。その場合、コードはよりクリーンになり、リクエストインターフェイスを介して個人と住所を組み合わせる必要はありません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加