如何在 JSON 反序列化期间处理前向引用?

How to handle forward references during JSON deserialisation?

我必须在 Jackson 中像这样解析 JSON:

"people": [
    {
        "personId": 1,
        "name": "An",
        "friends": [{"personId": 2}]
    },
    {
        "personId": 2,
        "name": "Bob",
        "friends": [{"personId": 1}]
    }
]

这应该会导致 An 的朋友数组包含 Bob,而 Bob 的朋友数组包含 An。我在 Person class:

上使用这个装饰器
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "personId")

问题在于,在反序列化过程中,Jackson 将 An 的朋友中的第一个人设为 null,因为 Bob 尚未被解析。解决此问题的最佳方法是什么?

如果您有可能稍微预处理您的 JSON,以便引用是纯 int,以下方法对您来说是最简单的:

@Data
@NoArgsConstructor
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "personId")
public class People {
    private int personId;
    private String name;
    private List<People> friends;
}

反序列化的小测试:

public class ForwardReferenceTest {
    @Test
    void forwardReference() throws JsonProcessingException {
        String json = "{\"people\": [\n" +
                "    {\n" +
                "        \"personId\": 1,\n" +
                "        \"name\": \"An\",\n" +
                "        \"friends\": [2]\n" +
                "    },\n" +
                "    {\n" +
                "        \"personId\": 2,\n" +
                "        \"name\": \"Bob\",\n" +
                "        \"friends\": [1]\n" +
                "    }\n" +
                "]}";

        Map<String, List<People>> people = new ObjectMapper().readValue(json, new TypeReference<Map<String, List<People>>>() {
        });
        assertThat(people.get("people").get(1).getFriends().get(0).getPersonId()).isEqualTo(1);
    }
}

你能试试这个吗?