2017-02-06 6 views
3
public class TestJacksonColor { 
     public static void main(String [] args) throws IOException { 
      ObjectMapper objectMapper = new ObjectMapper(); 
      Color black = new Color(0, 0, 0); 
      String json = objectMapper.writeValueAsString(black); 
      Color backToObject = objectMapper.readValue(json, Color.class); 
     } 
    } 

このコードでは、jackson objectmapperを使用してjava.awt.colorクラスをシリアル化しようとしています。結果のjson文字列を取得し、java.awt.colorクラスに逆直列化します。ただし、デシリアライズを実行すると、次のエラーが発生します。jacksonデシリアライザを使用してjava.awt.colorを逆シリアル化できません

スレッド「メイン」com.fasterxml.jackson.databind.JsonMappingExceptionの例外:種類が見つかりません適切なコンストラクタ[単純型、クラスをjava.awt.Color]:JSONオブジェクトから

をインスタンス化することができません

答えて

3

カスタムシリアライザとデシリアライザが必要です。いくつかの事前に組み込まれたmodulesがありますが、私はjava.awt.Colorを処理するものを認識していません。

public class JacksonColorTest { 

    public static class ColorSerializer extends JsonSerializer<Color> { 
     @Override 
     public void serialize(Color value, JsonGenerator gen, SerializerProvider serializers) throws IOException { 
      gen.writeStartObject(); 
      gen.writeFieldName("argb"); 
      gen.writeString(Integer.toHexString(value.getRGB())); 
      gen.writeEndObject(); 
     } 
    } 

    public static class ColorDeserializer extends JsonDeserializer<Color> { 
     @Override 
     public Color deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { 
      TreeNode root = p.getCodec().readTree(p); 
      TextNode rgba = (TextNode) root.get("argb"); 
      return new Color(Integer.parseUnsignedInt(rgba.textValue(), 16), true); 
     } 
    } 

    public static void main(String [] args) throws IOException { 
     ObjectMapper objectMapper = new ObjectMapper(); 
     SimpleModule module = new SimpleModule(); 
     module.addSerializer(Color.class, new ColorSerializer()); 
     module.addDeserializer(Color.class, new ColorDeserializer()); 
     objectMapper.registerModule(module); 

     Color testColor = new Color(1, 2, 3, 4); 
     String json = objectMapper.writeValueAsString(testColor); 
     Color backToObject = objectMapper.readValue(json, Color.class); 

     if (!testColor.equals(backToObject)) { 
      throw new AssertionError("round trip failed"); 
     } 
    } 
} 
+0

ありがとう:ここ

は、シリアライザ/デシリアライザのペアを定義し、Colorオブジェクトを処理するモジュールを登録する例です!私のソリューションはあなたが作ったものと似ています。私はjackson互換ではないと思われる多くのawtクラスを使用していますが、それらのすべてのカスタムde/serializerを魅力的に動作させました。 –

関連する問題