Java Jackson使用根密钥反序列化对象
我想使用Java反序列化JSON: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
{
"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]