Джексон Десериализация динамических данных не удается - PullRequest
0 голосов
/ 23 июня 2019
public class Baseproperties
{
@JsonProperty("id")
private String id ;
private Integer ccode;
//...set and geters
}


public class Person
{
@JsonProperty("name")
private String name ;
private Integer age;
@JsonProperty("props")
private Baseproperties bprop;
//...set and geters
}


public class Cars
{
@JsonProperty("model")
private String Model ;
private Integer yearOfMake;
@JsonProperty("props")
private Baseproperties bprop;
//...set and geters
}

public MessageWrapper
{
@JsonProperty("ct")
private String classType;
private Object data;
//...set and geters
}

Мне нужно сериализовать класс MessageWrapper в json, но подход не удается из-за невозможности десериализации данных объекта;здесь я читаю classType и десериализовываю его для Person или CarType

// Person {"name": "arnold", "age": 21}

// car {"model":" Moriz "," yearOfMake ": 1892}

//example MessageWrapper
String s= "{
  "ct": "<packagename>.car",
  "data": {
      "model": "Moriz",
      "yearOfMake": 1892
      "props":{
      "id" : "12312",
      "ccode" :33
      }
    }

}"

mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
MessageWrapper mw = mapper.readValue(s, MessageWrapper.class);
if(mw.getclassType().toString().equals("<packagename>.car"))
Cars cw = mapper.readValue(mw.getData(), Cars.class);
but cw is wrong // serialise fails.

1 Ответ

0 голосов
/ 23 июня 2019

Это потому, что не существует метода ObjectMapper::readValue, который принимает Object в качестве первого аргумента.

По умолчанию при вашем подходе Джексон десериализует ваше поле data до LinkedHashMap, потому что вы его далиObject type.

Чтобы затем десериализовать это значение вручную, вам нужно будет использовать ObjectMapper::convertValue и передать Cars.class в качестве аргумента:

Cars cw = mapper.convertValue(mw.getData(), Cars.class);

А такжеизбавьтесь от:

mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);

, поскольку здесь это, по-видимому, не нужно.

И просто добавлю, я не уверен, что подход с такими динамическими данными хорош, потому что, если выбудет создавать все больше и больше типов объектов, в результате вы получите башню с ifs или оператором колозального переключателя.

...