杰克逊用root键反序列化对象

时间:2017-10-03 11:25:47

标签: java json jackson deserialization

我想使用Java反序列化JSON:

{  
   "Smith":{  
      "id":1,
      "age": 20
   },
   "Carter":{  
      "id":2,
      "age": 21
   }
}

到这个类的对象列表:

class Person {
    private Long id;
    private Integer age;
    private String name; //here I want to have eg. Smith

    //getters and setters
}

怎么做?

4 个答案:

答案 0 :(得分:0)

ObjectMapper map = new ObjectMapper();
String json ="your json here " 
Person person = map.readValue(json, Person.class);

这是标准方法, 在你的情况下你的json看起来有点不同,所以你必须创建一个与你的JSON匹配的pojo类

答案 1 :(得分:0)

这将通过映射(在此特定情况下)例如:

Person myPerson = new ObjectMapper().readValue(YOURJSONHERE, Person.class);

映射器会将Person模型中指定的属性映射到JSON中的相应字段。如果您有任何问题,请尝试查看here

但是,JSON的结构方式表明它会映射到“Smith”或“Carter”类,因此使用映射器的正确格式为:

{
 "Person":{
     "name":"Smith",
     "id": 1,
     "age": 20
  }
}

答案 2 :(得分:0)

使用gson非常简单:

Type type = new TypeToken<List<Person>>() {}.getType();
Gson gson = new GsonBuilder().create();
List<Person> person = gson.fromJson(yourJson, type);

答案 3 :(得分:0)

这是一个粗略的工作示例,没有遵循最佳实践,但如果你在其他地方使用杰克逊,你应该能够弄明白。您也可以注册一个自定义模块,如果它在其他地方以这种方式序列化,也可以使用相同的逻辑。

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

public class Test {

    static class Person {
        private Long id;
        private Integer age;
        private String name; //here I want to have eg. Smith

        public Person() {

        }

        public Long getId() {
            return id;
        }
        public void setId(Long id) {
            this.id = id;
        }
        public Integer getAge() {
            return age;
        }
        public void setAge(Integer age) {
            this.age = age;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        @Override
        public String toString() {
            return "Person [id=" + id + ", age=" + age + ", name=" + name + "]";
        }
    }

    public static void main(String[] args) throws JsonProcessingException, IOException {
        String json = "{  \n" +
                "   \"Smith\":{  \n" +
                "      \"id\":1,\n" +
                "      \"age\": 20\n" +
                "   },\n" +
                "   \"Carter\":{  \n" +
                "      \"id\":2,\n" +
                "      \"age\": 21\n" +
                "   }\n" +
                "}";

        ObjectMapper mapper = new ObjectMapper();
        JsonNode nodes = mapper.readTree(json);

        List<Person> people = new ArrayList<>();
        nodes.fields().forEachRemaining(entry -> {
            String name = entry.getKey();
            Person person = mapper.convertValue(entry.getValue(), Person.class);
            person.setName(name);
            people.add(person);
        });

        for (Person person : people) {
            System.out.println(person);
        }
    }
}

输出

Person [id=1, age=20, name=Smith]
Person [id=2, age=21, name=Carter]