【问题标题】:Deserialization of arrays with Jackson使用 Jackson 对数组进行反序列化
【发布时间】:2011-07-10 22:50:09
【问题描述】:

我有类似 JSON-RPC 客户端的东西,但我在反序列化时遇到了问题 将 json 字符串传入我的 java 对象。 传入的json格式为:

{"value":"xxxx","type":"xxxx"}

我要反序列化的对象:

@JsonAutoDetect
@JsonDeserialize()
public class ReturnValue {

private Object value;
private String type;

@JsonCreator
public ReturnValue(@JsonProperty("value") String val, @JsonProperty("type") String type) {
    value = val;
    this.type = type;
}

...getters, setters...

这似乎工作正常,如果值是字符串,但如果它是数组类型,它会抛出 JsonMapping 异常 - 无法从 START_ARRAY 令牌中反序列化 java.lang.String 的实例 对于这样的json:

{\"value\":[8, 10], \"type\":\"[int]\"}

代码是:

int[] arr = (int[])getReturnValue(jsonString).getValue();

getReturnValue 没有什么特别之处:

    ObjectMapper om = new ObjectMapper();
    ReturnValue rv = null;
    rv = om.readValue(json, ReturnValue.class);
    return rv;

另一个问题是我希望 type 属性是 Class 类型,但这会抛出 另一个映射异常。杰克逊有没有办法做到这一点,或者我必须自己从字符串转换为适当的类。谢谢你的建议。

【问题讨论】:

    标签: java json jackson deserialization


    【解决方案1】:

    将您的构造函数更改为:

    @JsonCreator
    public ReturnValue(@JsonProperty("value") Object val, @JsonProperty("type") String type) {
    

    因为,就像错误指出的那样,它不知道如何从数组中创建一个字符串。但是String和JSON Array都可以转成Object;如果是这样,它将是 Java String、Java List(用于 JSON 数组)或 Java Map(用于 JSON 对象)。

    【讨论】:

      猜你喜欢
      • 2021-12-13
      • 1970-01-01
      • 2015-01-05
      • 1970-01-01
      • 1970-01-01
      • 2016-03-14
      • 2011-09-15
      • 1970-01-01
      相关资源
      最近更新 更多