4

カスタムのシリアライズされたオブジェクトをデシリアライズしたいと考えています。私のオブジェクトは、基本的に単純な 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

   }
}
4

2 に答える 2

0

私はいくつかの注釈 (JsonTypeInfoおよびJsonUnwrapped) を使用して回答を求めていましたが、これら 2 つがうまく連携していないようです (この問題を参照してください)。カスタムデシリアライザーに依存せずに、問題のシリアライゼーションとデシリアライゼーションの両方の部分を処理できます。代わりに、これらの線に沿って何かを行うカスタム デシリアライザーが必要になります。

class PairDeserializer extends JsonDeserializer<Pair>{
    static Map<String, Class> MAPPINGS = new HashMap<String, Class>();
    @Override
    public Pair deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        Object key = deserializeField(jp);
        Object value = deserializeField(jp);
        Pair pair = new Pair();
        pair.k = key;
        pair.v = value;
        jp.nextToken();
        return pair;
    }

    private Object deserializeField(JsonParser jp) throws IOException, JsonParseException, JsonProcessingException {
        jp.nextValue();
        String className = jp.getCurrentName();
        return jp.readValueAs(MAPPINGS.get(className));
    }
}

次に、必要なマッピングを登録するだけです

于 2013-05-24T17:52:15.647 に答える