Jackson XML-Deserialisierung von java.awt.Color aus den Attributen „r“, „g“, „b“, „a“?
Posted: 12 Jan 2025, 03:08
Ich habe ein Legacy-System mit dem folgenden (vereinfachten) Ansatz
und die XML-Darstellung davon ist
Das mit einem ColorSerializer serialisieren;
Beachten Sie den Trick, den Feldnamen „Farbe“ in „r“ umzubenennen und dann nacheinander drei zusätzliche Attribute zu erstellen.
Aber Ich kann NICHT herausfinden, wie ich das zurück in eine java.awt.Color-Instanz deserialisieren kann. Ich erhalte eine Ausnahme, die besagt, dass das Attribut „" ist unbekannt. Es scheint, dass das XML den Prozess steuert, während ich denke, dass ich den Parser dazu bringen müsste, sich den Java-Code anzusehen und diese Laufwerkssuche im analysierten XML durchführen zu lassen.
Irgendwelche Ideen, wie man das machen kann?
BEARBEITEN: Der Deserializer wird voraussichtlich etwa so aussehen:
Code: Select all
public class Gadget {
@JacksonXmlProperty
private Color color;
:
:
}
Code: Select all
Code: Select all
public class ColorSerializer extends StdSerializer {
public ColorSerializer() {
super(Color.class);
}
@Override
public void serialize(Color color, JsonGenerator gen, SerializerProvider provider) throws IOException {
if (!(gen instanceof ToXmlGenerator)) {
throw new UnsupportedOperationException("ColorSerializer can only be used with XML serialization");
}
ToXmlGenerator xmlGen = (ToXmlGenerator) gen;
xmlGen.setNextName(new QName(null, "r"));
xmlGen.setNextIsAttribute(true);
xmlGen.writeNumber(color.getRed());
xmlGen.setNextIsAttribute(true);
xmlGen.writeNumberField("g", color.getGreen());
xmlGen.setNextIsAttribute(true);
xmlGen.writeNumberField("b", color.getBlue());
xmlGen.setNextIsAttribute(true);
xmlGen.writeNumberField("a", color.getAlpha());
}
}
Aber Ich kann NICHT herausfinden, wie ich das zurück in eine java.awt.Color-Instanz deserialisieren kann. Ich erhalte eine Ausnahme, die besagt, dass das Attribut „
Code: Select all
r
Irgendwelche Ideen, wie man das machen kann?
BEARBEITEN: Der Deserializer wird voraussichtlich etwa so aussehen:
Code: Select all
public class ColorDeserializer extends StdDeserializer {
ColorDeserializer() {
super(Color.class);
}
@Override
public Color deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JacksonException {
TreeNode node = p.getCodec().readTree(p);
int red = colorValueOf(node, "r");
int green = colorValueOf(node, "g");
int blue = colorValueOf(node, "b");
int alpha = colorValueOf(node, "a");
return new Color(red, green, blue, alpha);
}
private int colorValueOf(TreeNode node, String value) {
JsonNode jsonNode = (JsonNode) node.get(value);
if( jsonNode != null ) {
return Integer.parseInt(jsonNode.asText());
}
return 0;
}
}