カスタムのシリアライズされたオブジェクトをデシリアライズしたいと考えています。私のオブジェクトは、基本的に単純な Pair 実装で構成されています。
class School{
Integer id;
String schoolName;
}
class Student{
Integer id;
Integer schoolId;
String studentName;
}
@JsonSerialize(using=PairSerializer.class)
public class Pair<V,K>{
V v;
K k;
}
これが結果です
[
{
"v":{
"id":1,
"schoolId":3,
"studentName":"O. Bas"
},
"k":{
"id":3,
"schoolName":"School 3"
}
},
{
"v":{
"id":2,
"schoolId":3,
"studentName":"C. Koc"
},
"k":{
"id":3,
"schoolName":"School 3"
}
}
]
json のフィールド名としての v と k はかなり醜いです。そのため、カスタム シリアライザーを次のように記述しました。
@Override
public void serialize(Pair pair, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
jsonGenerator.writeStartObject();
jsonGenerator.writeObjectField(CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_CAMEL,pair.getK().getClass().getSimpleName() ), pair.getK());
jsonGenerator.writeObjectField(CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_CAMEL,pair.getV().getClass().getSimpleName() ), pair.getV());
jsonGenerator.writeEndObject();
}
結果はまさに私が望むものです。v および k フィールド名は、クラス名に置き換えられます。
[
{
"school":{
"id":3,
"schoolName":"School 3"
},
"student":{
"id":1,
"schoolId":3,
"studentName":"O. Bas"
}
},
{
"school":{
"id":3,
"schoolName":"School 3"
},
"student":{
"id":2,
"schoolId":3,
"studentName":"C. Koc"
}
}
]
これが私の質問です。json 文字列を に逆シリアル化するにはどうすればよいList<Pair<V, K>
ですか? 本当の問題は、V と K が逆シリアル化されたコンテキストに依存し、学生、学校、または別のペアの実装によって異なる可能性があることです。
public class PairDeserializer extends JsonDeserializer<Pair> {
public PairDeserializer() {
}
@Override
public Pair deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
// I need to Deserialized generic type information of Pair
}
}