gpt4 book ai didi

java - Jackson 动态数据反序列化失败,

转载 作者:行者123 更新时间:2023-12-02 04:03:40 26 4
gpt4 key购买 nike

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,但由于无法反序列化Object数据,该方法失败;在这里,我正在读取 classType 并将其反序列化为 Person 或 CarType

//人{ “姓名”:“阿诺德”, “年龄”:21}

//汽车{ “模型”:“莫里兹”, “制作年份”: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.

最佳答案

这是因为没有将 Object 作为第一个参数的 ObjectMapper::readValue 方法。

默认情况下,您的方法 Jackson 会将您的 data 字段反序列化为 LinkedHashMap,因为您已为其指定了 Object 类型。

要手动反序列化该值,您必须使用 ObjectMapper::convertValue并传递 Cars.class 作为参数:

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

并且还要摆脱:

mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);

因为这里似乎不需要它。

补充一下,我不确定使用此类动态数据的方法是否良好,因为如果您要创建越来越多类型的对象,您最终会得到一座 ifs 或巨大的 switch 语句。

关于java - Jackson 动态数据反序列化失败,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56722583/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com