外部サービスは、プレーン/プリミティブ要素を持つJSON配列を提供しています(フィールド名がなく、ネストしたJSONオブジェクトはありません)。私はジャクソンを使用して、次のJavaクラスのインスタンスにこれを変換したいジャクソン、プレーンなJSON配列を単一のJavaオブジェクトにデシリアライズ
["Foo", "Bar", 30]
:たとえば
class Person {
private String firstName;
private String lastName;
private int age;
Person(String firstName, String lastName, int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
}
(必要であれば、このクラスは適合させることができる。)
質問:このJSONをJavaに逆シリアル化することは可能ですか?
Person p = new ObjectMapper().readValue(json, Person.class);
これは、このPersonクラスのカスタムジャクソンデシリアライザを記述することによってのみ可能ですか?
私は次のことをしようとしましたが、それはうまくいきませんでした:
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
public class Person {
private String firstName;
private String lastName;
private int age;
@JsonCreator
public Person(
@JsonProperty(index = 0) String firstName,
@JsonProperty(index = 1) String lastName,
@JsonProperty(index = 2) int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
public static void main(String[] args) throws IOException {
String json = "[\"Foo\", \"Bar\", 30]";
Person person = new ObjectMapper().readValue(json, Person.class);
System.out.println(person);
}
}
結果:Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Argument #0 of constructor [constructor for Person, annotations: {interface [email protected]son.annotation.JsonCreator(mode=DEFAULT)}] has no property name annotation; must have name when multiple-parameter constructor annotated as Creator at [Source: (String)"["Foo", "Bar", 30]"; line: 1, column: 1]