无法将 JSON 十六进制颜色转换为 Java 字符串或 java.awt.Color

Can't turn JSON hex color into Java string or java.awt.Color

我有一个 class Foo:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Foo {
  private String color = "cccccc";

  public void setColor(String color) {
    this.color = color;
  }

  @FlexField(fieldType = FlexField.FlexFieldType.ReadWrite)
  public Color getColor() {
    return ColorUtil.getColor(color);
  }

  public void setColor(Color color) {
    this.color = ColorUtil.getHexString(color);
  }
}

杰克逊混色:

abstract class ColorMixIn extends java.awt.Color{
    ColorMixIn(@JsonProperty("red") int red, @JsonProperty("green") int green, @JsonProperty("blue") int blue) {
        super(red, green, blue);
    }

    @Override @JsonProperty("red") public abstract int getRed();
    @Override @JsonProperty("green") public abstract int getGreen();
    @Override @JsonProperty("blue") public abstract int getBlue();

}

一个杰克逊颜色模块:

public class ColorModule extends SimpleModule {
    @Override
    public void setupModule(SetupContext context) {
        context.setMixInAnnotations(java.awt.Color.class, ColorMixIn.class);
        //other setup if needed
    }
}

他们注册的内容如下:

val mapper: ObjectMapper = new ObjectMapper
mapper.registerModule(new ColorModule())

当我 return a Foo 它按预期序列化:

"foo": {
  "color": {
    "red": 204,
    "green": 204,
    "blue": 204
  }
}

然而,当我想从 JSON 创建一个 foo 时,它只会创建:

"foo": {
  "color": "cccccc"
}

我试过 JSON 看起来像:

"foo": {
  "color": {
    "red": 224,
    "green": 224,
    "blue": 224
  }
}

"foo": {
  "color": "dddddd"
}

无济于事。

我想在 ColorMixin class 中创建一个新的构造函数,看起来像:

ColorMixIn(@JsonProperty("color") String hex) {
  super(java.awt.Color.decode(hex).getRed(), java.awt.Color.decode(hex).getGreen(), java.awt.Color.decode(hex).getBlue()
}

可能有帮助,但没有快乐。

我确定我遗漏了一些明显的东西,有什么想法吗?

您的 Foo class 有两个 setColor 方法接受不同的类型:StringColor,而 String color 字段没有明确的 JsonProperty 注释。鉴于此,Jackson 假设 color 是一个字符串,而不是 Color

考虑只为 color 字段使用一个 setter 方法。这是一个例子:

public class JacksonColor {

    static class Foo {
        private Color color = new Color(0xcc, 0xcc, 0xcc);

        public Color getColor() { return color;}

        @Override
        public String toString() {
            return "Foo{" + "color=" + color + '}';
        }
    }

    @JsonAutoDetect(
            fieldVisibility = JsonAutoDetect.Visibility.NONE,
            isGetterVisibility = JsonAutoDetect.Visibility.NONE,
            getterVisibility = JsonAutoDetect.Visibility.NONE,
            setterVisibility = JsonAutoDetect.Visibility.NONE)
    public static abstract class ColorMixIn extends Color {

        public ColorMixIn(
                @JsonProperty("red") int red,
                @JsonProperty("green") int green,
                @JsonProperty("blue") int blue) {
            super(red, green, blue);
        }
        @JsonProperty("red") public abstract int getRed();
        @JsonProperty("green") public abstract int getGreen();
        @JsonProperty("blue") public abstract int getBlue();
    }

    public static void main(String[] args) throws IOException {
        final SimpleModule module = new SimpleModule();
        module.setMixInAnnotation(Color.class, ColorMixIn.class);
        final ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(module);
        final Foo foo = new Foo();
        final String json = mapper.writeValueAsString(foo);
        System.out.println(json);
        System.out.println(mapper.readValue(json, Foo.class));
    }
}

输出:

{"color":{"red":204,"green":204,"blue":204}}
Foo{color=java.awt.Color[r=204,g=204,b=204]}