提问者:小点点

如何用Jackson将十六进制颜色数组反序列化为awt.color


我从一个API获取一个JSON对象,包括:

"palette": ["#019701","#FE82B8","#FAFF04","#017FFF","#FD8141"],

我有这样的pojo:

public class PanelInfo {
//    ...
    private Color[] colorPalette;
//    ...
}

要反序列化,我尝试添加:

class ColorJsonDeserializer extends JsonDeserializer<Color> {

    @Override
    public Color deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
            
        return Color.decode(p.getValueAsString());
    }
}

以及从< code > p . getvalueasstring()中提取的其他变体。

不去。我尝试的一切都会得到回报:

com.fasterxml.jackson.databind.exc.MismatchedInputException:无法构造java.awt.Color的实例(尽管至少存在一个创建者):没有字符串参数构造函数/工厂方法可以从字符串值('#221875')反序列化

似乎我没有正确使用JsonParser。有什么想法吗?

更新:感谢 https://stackoverflow.com/users/11713777/dariosicily 这是工作代码:

public class PanelInfo {
...
@JsonDeserialize(contentUsing = ColorJsonDeserializer.class)
public Color[] palette;
...
}

和解串器类:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.awt.Color; 
import java.io.IOException;


 public  class ColorJsonDeserializer extends JsonDeserializer<Color> {

    @Override
    public Color deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        return new Color(Integer.parseUnsignedInt(p.getValueAsString().substring(1), 16));
    }

}

注意子字符串以摆脱前导#


共1个答案

匿名用户

您可以使用JsonDeserialize注释和contentUsing反序列化程序类来注释调色板字段,因为palette是一个Color数组,而不是一个值:

public class PanelInfo {

    @JsonDeserialize(contentUsing = ColorJsonDeserializer.class)
    private Color[] palette;
}