使用键值映射嵌套对象 // Jackson
Mapping a nested object with key value // Jackson
我正在尝试使用 Jackson 映射嵌套对象。以下是我的 JSON 的样子:
{
"123456789": {
"name": "Test",
"org": "test",
"users": [
{
"123_cc": {
"id": "123_cc",
"name": "user1",
"type": "NEW",
"email": "test@test.com"
}
},
{
"146_cc": {
"id": "146_cc",
"name": "user2",
"type": "NEW",
"email": "test1@test1.com"
}
}
]
}
}
以下是我的模型:
public class Payload {
@JsonProperty("name")
private String name;
@JsonProperty("org")
private String org;
@JsonProperty("users")
private List<UserMap> users;
// getters, setters
}
public class UserMap {
@JsonProperty("req")
private String requestId;
@JsonProperty("user")
private User user;
}
public class User {
@JsonProperty("id")
private String id;
@JsonProperty("name")
private String name;
@JsonProperty("type")
private String type;
@JsonProperty("email")
private String email;
// getters, setters
}
我需要维护每个用户的键值。如果我将用户列表 private List<UserMap> users;
更改为 private List<Map<String, User>> users;
,它将正常工作。但是我想用模型替换地图列表。
您可以使用 @JsonAnySetter
注释来完成。
您需要将此方法添加到 UserMap
class:
@JsonAnySetter
void anyMethodName(String key, Object value) {
this.requestId = key;
HashMap<String, String> hashMap = (HashMap<String, String>) value;
this.user = new User();
this.user.setEmail(hashMap.get("email"));
this.user.setId(hashMap.get("id"));
this.user.setName(hashMap.get("name"));
this.user.setType(hashMap.get("type"));
}
正在解析:
public class Test {
public static void main(String[] args) throws IOException {
String json = "{\n" +
" \"123456789\": {\n" +
" \"name\": \"Test\",\n" +
" \"org\": \"test\",\n" +
" \"users\": [\n" +
" {\n" +
" \"123_cc\": {\n" +
" \"id\": \"123_cc\",\n" +
" \"name\": \"user1\",\n" +
" \"type\": \"NEW\",\n" +
" \"email\": \"test@test.com\"\n" +
" }\n" +
" },\n" +
" {\n" +
" \"146_cc\": {\n" +
" \"id\": \"146_cc\",\n" +
" \"name\": \"user2\",\n" +
" \"type\": \"NEW\",\n" +
" \"email\": \"test1@test1.com\"\n" +
" }\n" +
" }\n" +
" ]\n" +
" }\n" +
"}";
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(json).get("123456789");
Payload payload = objectMapper.treeToValue(jsonNode, Payload.class);
System.out.println(payload);
}
}
结果:
Payload(name=Test, org=test, users=[UserMap(requestId=123_cc, user=User(id=123_cc, name=user1, type=NEW, email=test@test.com)), UserMap(requestId=146_cc, user=User(id=146_cc, name=user2, type=NEW, email=test1@test1.com))])
我正在尝试使用 Jackson 映射嵌套对象。以下是我的 JSON 的样子:
{
"123456789": {
"name": "Test",
"org": "test",
"users": [
{
"123_cc": {
"id": "123_cc",
"name": "user1",
"type": "NEW",
"email": "test@test.com"
}
},
{
"146_cc": {
"id": "146_cc",
"name": "user2",
"type": "NEW",
"email": "test1@test1.com"
}
}
]
}
}
以下是我的模型:
public class Payload {
@JsonProperty("name")
private String name;
@JsonProperty("org")
private String org;
@JsonProperty("users")
private List<UserMap> users;
// getters, setters
}
public class UserMap {
@JsonProperty("req")
private String requestId;
@JsonProperty("user")
private User user;
}
public class User {
@JsonProperty("id")
private String id;
@JsonProperty("name")
private String name;
@JsonProperty("type")
private String type;
@JsonProperty("email")
private String email;
// getters, setters
}
我需要维护每个用户的键值。如果我将用户列表 private List<UserMap> users;
更改为 private List<Map<String, User>> users;
,它将正常工作。但是我想用模型替换地图列表。
您可以使用 @JsonAnySetter
注释来完成。
您需要将此方法添加到 UserMap
class:
@JsonAnySetter
void anyMethodName(String key, Object value) {
this.requestId = key;
HashMap<String, String> hashMap = (HashMap<String, String>) value;
this.user = new User();
this.user.setEmail(hashMap.get("email"));
this.user.setId(hashMap.get("id"));
this.user.setName(hashMap.get("name"));
this.user.setType(hashMap.get("type"));
}
正在解析:
public class Test {
public static void main(String[] args) throws IOException {
String json = "{\n" +
" \"123456789\": {\n" +
" \"name\": \"Test\",\n" +
" \"org\": \"test\",\n" +
" \"users\": [\n" +
" {\n" +
" \"123_cc\": {\n" +
" \"id\": \"123_cc\",\n" +
" \"name\": \"user1\",\n" +
" \"type\": \"NEW\",\n" +
" \"email\": \"test@test.com\"\n" +
" }\n" +
" },\n" +
" {\n" +
" \"146_cc\": {\n" +
" \"id\": \"146_cc\",\n" +
" \"name\": \"user2\",\n" +
" \"type\": \"NEW\",\n" +
" \"email\": \"test1@test1.com\"\n" +
" }\n" +
" }\n" +
" ]\n" +
" }\n" +
"}";
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(json).get("123456789");
Payload payload = objectMapper.treeToValue(jsonNode, Payload.class);
System.out.println(payload);
}
}
结果:
Payload(name=Test, org=test, users=[UserMap(requestId=123_cc, user=User(id=123_cc, name=user1, type=NEW, email=test@test.com)), UserMap(requestId=146_cc, user=User(id=146_cc, name=user2, type=NEW, email=test1@test1.com))])