Java Jackson使用根密钥反序列化对象

Java Jackson使用根密钥反序列化对象,java,json,jackson,deserialization,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

我想使用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
}
如何做到这一点

ObjectMapper map = new ObjectMapper();
String json ="your json here " 
Person person = map.readValue(json, Person.class);
这是标准方法,,
在您的情况下,您的json似乎有点不同,因此您必须创建一个与您的json匹配的pojo类,这将通过映射实现(在本例中),例如:

Person myPerson = new ObjectMapper().readValue(YOURJSONHERE, Person.class);
映射器将把您的Person模型中指定的属性映射到JSON中的相应字段。如果你有任何问题,试试看

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

{
 "Person":{
     "name":"Smith",
     "id": 1,
     "age": 20
  }
}
使用非常简单:

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

这是一个粗略的示例,没有遵循最佳实践,但如果您在其他地方使用Jackson,您应该能够找到答案。您还可以注册一个自定义模块,如果它在其他地方也以这种方式序列化,则该模块可以使用相同的逻辑

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);
        }
    }
}

这不管用。问题在于名称字段。需要更多的自定义映射。这是正确的,我忽略了它,请检查编辑。您的JSON和类不匹配,因此这确实需要自定义映射。它是什么样子并不取决于我。在这种情况下,试着看看这里,然后看看名称字段。它会被正确地映射吗?好的,我没意识到。也许有一种方法,但据我所知,您不应该创建一个迭代器来迭代json中的所有键。然后将“Smith”移动到名为name的新钥匙上。我曾经做过类似的事情。看见这可能有助于您更改JSON的结构吗?因为这将是最简单的选择,请使用自定义Desiralizer查看此答案谢谢@Matt这正是我要找的。经过一些调整后,它工作了。
Person [id=1, age=20, name=Smith]
Person [id=2, age=21, name=Carter]