【问题标题】:How to use Jackson to deserialize to list or value based upon JSON? [duplicate]如何使用 Jackson 反序列化到基于 JSON 的列表或值? [复制]
【发布时间】:2013-09-11 11:05:34
【问题描述】:

我有一个以下格式的json,其中key代表属性类型,value代表该属性的值。

{ "attributes":
[
  {
    "key":"name",
    "value":"Archit"
  },
  { 
    "key":"website",
    "value":"stackoverflow"
  },
  { 
    "key":"languages",
    "value":[
              "python",
              "java",
              "c++"
            ]
  }
]
}

我正在尝试使用 jackson 将其映射到以下 java 对象:

public class Attributes {
  List<Attribute> attributes;
}



public abstract class Attribute {
  String key;
}



public class SingleValuedAttribute extends Attribute{
  String value;
}


public class MultiValuedAttribute extends Attribute{
  List<String> value;
}


  ObjectMapper mapper = new ObjectMapper();
  Attributes attributes = mapper.readValue(new File(jsonFilePath), Attributes.class);

我尝试查看多态反序列化,但需要 json 对象中的类型信息,而这在我的 json 中不存在?

关于如何做到这一点的任何提示?

PS: 我无法更改 json 格式。 键列表不受限制/限制。

【问题讨论】:

  • 您可能必须使用自定义 JsonDeserializer 映射到您的任一 Attribute 实现,具体取决于您获得的是数组还是对象。

标签: java json serialization jackson json-deserialization


【解决方案1】:

我看不出SingleValuedAttributeMultiValuedAttribute 类之间的区别。 SingleValuedAttribute 类代表一个元素数组。您可以通过删除 POJO 类层次结构来简化它。

请看下面的例子:

import java.io.File;
import java.util.Arrays;
import java.util.List;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonProgram {

    public static void main(String[] args) throws Exception {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);

        File json = new File("/x/test.json");
        System.out.println(objectMapper.readValue(json, Attributes.class));
    }
}

class Attributes {

    private List<Attribute> attributes;

    //getters, setters
}

class Attribute {

    private String key;
    private List<String> value;

    //getters, setters
}

上面的程序打印:

[Attribute [key=name, value=[Archit]], Attribute [key=website, value=[stackoverflow]], Attribute [key=languages, value=[python, java, c++]]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多