0

我有一个以下格式的 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 格式。键列表不受限制/限制。

4

1 回答 1

2

我看不出SingleValuedAttributeMultiValuedAttribute类之间的区别。SingleValuedAttributeclass 表示一个元素数组。您可以通过删除 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++]]]
于 2013-09-07T21:48:10.750 回答