问题
I am trying to convert JSON into POJO. I have worked with Jackson to convert standard JSON file. In this particular case, I would like to overwrite the key value to "default" class/variable. In this case, there are multiple key value to be replaced (ie. hundreds, and the key values to be replaced are unknown).
Is this possible? I thought of storing it into Map, then iterate and store each into POJO, but wondering if there is different option, since I am not that familiar with storing JSON to Map.
Example of the JSON to be processed:
"People" : {
"person1" : {
"name" : "john doe",
"address" : "123 main st",
"email" : "john@doe.com"
},
"person2" : {
"name" : "bob cat",
"address" : "234 dog st",
"email" : "bob@cat.com"
},
"person3" : {
"name" : "foo bar",
"address" : "111 1st ave",
"email" : "foo@bar.com"
},
"person8" : {
"name" : "james bono",
"address" : "999 alaska st",
"email" : "james@bono.com"
}
}
Is it possible to generate the class in the following structure? The main issue is there are hundreds of value to be replaced and assuming they are unknown, I can't use this approach.
@JsonIgnoreProperties(ignoreUnknown = true)
public class People {
@JsonAlias({"person1", "person2"})
private List<Details> person; // --> this should be the default replacing person1, person2, and so on
private class Details {
String name;
String address;
String email;
}
}
回答1:
You can use JsonAnySetter annotation for all properties personXYZ. See below example:
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class JsonApp {
public static void main(String[] args) throws Exception {
File jsonFile = new File("./resource/test.json").getAbsoluteFile();
ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
System.out.println(mapper.readValue(jsonFile, People.class).getPersons());
}
}
class People {
private List<Details> persons = new ArrayList<>();
@JsonAnySetter
public void setPerson(String name, Details person) {
this.persons.add(person);
}
public List<Details> getPersons() {
return persons;
}
public static class Details {
String name;
String address;
String email;
// getters, setters, toString
}
}
For your JSON above code prints:
[Details{name='john doe', address='123 main st', email='john@doe.com'}, Details{name='bob cat', address='234 dog st', email='bob@cat.com'}, Details{name='foo bar', address='111 1st ave', email='foo@bar.com'}, Details{name='james bono', address='999 alaska st', email='james@bono.com'}]
In case you use inner class remember to make it public static to make it visible to Jackson instantiation process.
See also:
- How to use dynamic property names for a Json object
- Jackson Annotation Examples
来源:https://stackoverflow.com/questions/57064917/json-jackson-deserialization-multiple-keys-into-same-field