如何在 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);
}
}
你能试试这个吗?
我必须在 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);
}
}
你能试试这个吗?