package com.fasterxml.jackson.dataformat.xml.deser;

import java.io.IOException;

import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer;
import com.fasterxml.jackson.databind.jsontype.TypeDeserializer;

Custom variant used instead of "plain" StringDeserializer to handle couple of edge cases that XML parser exposes.

NOTE: mostly copy-pasted from standard StringDeserializer

Since:2.9.4
/** * Custom variant used instead of "plain" {@code StringDeserializer} to handle * couple of edge cases that XML parser exposes. *<p> * NOTE: mostly copy-pasted from standard {@code StringDeserializer} * * @since 2.9.4 */
public class XmlStringDeserializer extends StdScalarDeserializer<String> { private static final long serialVersionUID = 1L; public XmlStringDeserializer() { super(String.class); } @Override public boolean isCachable() { return true; } @Override public Object getEmptyValue(DeserializationContext ctxt) throws JsonMappingException { return ""; } @Override public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { if (p.hasToken(JsonToken.VALUE_STRING)) { return p.getText(); } JsonToken t = p.getCurrentToken(); if (t == JsonToken.START_ARRAY) { return _deserializeFromArray(p, ctxt); } if (t == JsonToken.VALUE_EMBEDDED_OBJECT) { Object ob = p.getEmbeddedObject(); if (ob == null) { return null; } if (ob instanceof byte[]) { return ctxt.getBase64Variant().encode((byte[]) ob, false); } // otherwise, try conversion using toString()... return ob.toString(); } // allow coercions, as handled by `FromXmlParser.getValueAsString()`: this includes // START_OBJECT in some cases. String text = p.getValueAsString(null); if ((text != null) || (t == JsonToken.VALUE_NULL)) { return text; } return (String) ctxt.handleUnexpectedToken(_valueClass, p); } // Since we can never have type info ("natural type"; String, Boolean, Integer, Double): // (is it an error to even call this version?) @Override public String deserializeWithType(JsonParser p, DeserializationContext ctxt, TypeDeserializer typeDeserializer) throws IOException { return deserialize(p, ctxt); } }