2017-07-04 8 views
2

自分の複雑なシリアライザorg.apache.commons.lang3.tuple.Pairを使わずにジャンクソンを作ることができれば、左右のオブジェクトを適切な方法で直列化することができます。だから、例えば私は、次のコードを持っている:jacksonでapacheのコモンズをシリアライズする

public class MyPairTest { 

    public static void main(String[] args) { 
     Address address1 = new Address("Axel Street 1", "London"); 
     Address address2 = new Address("Axel Street 2", "Copenhagen"); 

     Map<String, Pair> map = new HashMap<>(); 
     map.put("Address", Pair.of(address1, address2)); 

     Pair p = Pair.of(address1, address2); 

     ObjectMapper mapper = new ObjectMapper(); 
     mapper.enable(SerializationFeature.INDENT_OUTPUT); 
     try { 
      String serializeMapWithPair = mapper.writeValueAsString(map); 
      String serializePair = mapper.writeValueAsString(p); 
      System.out.println(serializeMapWithPair); 
      System.out.println(serializePair); 
     } catch (JsonProcessingException e) { 
      e.printStackTrace(); 
     } 

     Gson gson = new Gson(); 
     System.out.println(gson.toJson(p)); 
    } 
} 

そして、出力結果は次のようになります。だから、最初の二つの出力が最後にGsonであるように、私が欲しいジャクソンObjectMapperでPairをシリアル化している

{ 
    "Address" : { 
    "[email protected]" : { 
     "street" : "Axel Street 2", 
     "city" : "Copenhagen" 
    } 
    } 
} 
{ 
    "[email protected]" : { 
    "street" : "Axel Street 2", 
    "city" : "Copenhagen" 
    } 
} 
{"left":{"street":"Axel Street 1","city":"London"},"right":{"street":"Axel Street 2","city":"Copenhagen"}} 

Gsonの例のように結果が得られますが、jacksonとleftrightの部分はありません。 Gson例私はthis jira improvement suggestionから得て、私は彼らが次のように述べていることを知っています"Commons-lang has no dependencies, so Jackson or anything similar can not be used."しかし、ジャクソンが自分でシリアライザやこの種を作ったのかどうか疑問に思っていました。ジャクソン?または、私は単にそれをドロップし、Gsonを使用し、手動でleftright部分を手動で操作して削除する必要がありますか?

答えて

1

私は、前後のフィールドで自分のジェネリッククラスを実装して、それをシリアル化して、最後にどのようにしたいのかにもかかわらず動作すると思うので、次のようなものになりますクラス:

public class MyPair<T> { 
    private T before; 
    private T after; 

    private MyPair(T before, T after) { 
     this.before = before; 
     this.after = after; 
    } 

    public static <T> MyPair<T> of(final T before, final T after) { 
     return new MyPair<>(before, after); 
    } 

    public T getBefore() { 
     return this.before; 
    } 

    public T getAfter() { 
     return this.after; 
    } 

    public void setBefore(T before) { 
     this.before = before; 
    } 

    public void setAfter(T after) { 
     this.after = after; 
    } 
} 

、その後、私はちょうどMyPair.of(address1, address2)を呼び出すと、私は:)期待していたものです

{ 
    "Address" : { 
    "before" : { 
     "street" : "Axel Street 1", 
     "city" : "London" 
    }, 
    "after" : { 
     "street" : "Axel Street 2", 
     "city" : "Copenhagen" 
    } 
    } 
} 

ように、そのシリアライズさを得ることができます。ちょうどそれが同じオブジェクト型で呼び出されていることを確認する必要があります、他のコンパイル時のエラーをスローする、今のところ動作していないようだのでof()は2つの異なる型で呼び出すことができます。

関連する問題