使用键值映射嵌套对象 // 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))])