无法将 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
方法接受不同的类型:String
和 Color
,而 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]}
我有一个 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
方法接受不同的类型:String
和 Color
,而 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]}