'Deserialize multiple json fields into single java property

I want to convert a json into Java class by having custom deserializer. I'm able to serialize ACC_NUM, NAME and any other fields from json but not sure what can be done to convert MOBILE_NUMBER_1,MOBILE_NUMBER_2 like fields into single JSONArray(See AccountInfo class). There can be many more fields like this and count also is not fixed. Example there can be ADDRESS_1, ADDRESS_2 till ADDRESS_20 and so on and all this fields should go in JSONArray of ADDRESS after deserilization.

I have a Map of Map which holds info like this:

{
    "accountInfo": {
        "ACC_NUM": "1234567890",
        "NAME": "John Cena",
        "MOBILE_NUMBER_1": "12376534",
        "MOBILE_NUMBER_2": "12376534",
        "MOBILE_NUMBER_3": "12376534",
        "MOBILE_NUMBER_4": "12376534"
    },
    "someOther": {
        //similer to above
    }
}

This info I want to convert to the following class CommonInfo:

public class CommonInfo { 
    private AccountInfo accountInfo;
    //other properties...
}

@JsonIgnoreProperties(ignoreUnknown = true)
public class AccountInfo { 
    @JsonProperty("ACC_NUM")
    private FieldValue<BigInteger> accountNum;

    @JsonProperty("NAME")
    private FieldValue<String> name;

    @JsonProperty("MOBILE_NUMBER")
    private FieldValue<JSONArray> mobileNumber;
}


//FieldValue class
public interface FieldValue<T> {

        T getInitialValue();

        void setInitialValue(T initialValue);

        T getValue();

        void setValue(T value);
}

@JsonInclude(JsonInclude.Include.ALWAYS)
public class FieldValueImpl<T> implements FieldValue<T> {
    protected T initialValue;
    protected T value;
    //getters, setters, cons..
}

My service code takes json/Map and tries to convert it to CommonInfo class

@Service
public class MyService {

    private final ObjectMapper jsonMapper = new ObjectMapper();


    @PostConstruct
    protected void init() {
        SimpleModule simpleModule = new SimpleModule();
        simpleModule.addSerializer(FieldValue.class, new FieldValueSerializer());
        simpleModule.addDeserializer(FieldValue.class, new FieldValueDeserializer());
        jsonMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
        jsonMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        jsonMapper.registerModule(simpleModule);

    }

    public CommonInfo setPojoResult(Map<String, LinkedHashMap<String, String>> contentAsMap) {
        return jsonMapper.convertValue(contentAsMap, CommonInfo.class);
    }
}

Serializer and Deserializer looks like this:

public class FieldValueDeserializer extends JsonDeserializer<FieldValue<?>> implements ContextualDeserializer {
    private JavaType valueType;

    public JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty property)
            throws JsonMappingException {
        var deserializer = new FieldValueDeserializer();
        if (property == null) {
            deserializer.valueType = ctxt.getContextualType().containedType(0);
        } else {
            var wrapperType = property.getType();
            var valueType = wrapperType.containedType(0);
            deserializer.valueType = valueType;
        }
        return deserializer;
    }

    @Override
    public FieldValue<?> deserialize(JsonParser parser, DeserializationContext context) throws IOException {
        FieldValueDeserializer deserializer = new FieldValueDeserializer();
        deserializer.getKnownPropertyNames();
        FieldValue<?> fieldValueImpl = new FieldValueImpl<>();

        if (valueType.toString().contains("java.time.LocalDate")) {
            JsonNode node = parser.getCodec().readTree(parser);
            FieldValue<LocalDate> f1 = new FieldValueImpl<>();
            f1.setValue(DateUtils.convertJulianToLocalDate(node.textValue()));
            return f1;
        } else {
            fieldValueImpl.setValue(context.readValue(parser, valueType));
        }

        return fieldValueImpl;
    }
}

//--

public class FieldValueSerializer extends StdSerializer<FieldValue> {

    public FieldValueSerializer() {
        this(null);
    }

    public FieldValueSerializer(Class<FieldValue> vc) {
        super(vc);
    }

    @Override
    public void serialize(FieldValue value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
        jgen.writeString(String.valueOf(value.getCurValue()));
    }
}



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source