杰克逊如何处理映射冲突?
How Jackson handles mapping conflict?
我有以下 class,其中 属性 "key" 映射到 2 个不同的 JSON
字段
public class A {
@JsonAlias("Key")
private String key;
@JsonProperty("NewKey")
private void unpackNewKey(Map<String, String> NewKey) {
key = NewKey.get("value");
}
}
这是要反序列化的JSON。
{
"NewKey": {
"value": "newkey",
},
"Key": "key"
}
如果我将上面的 json 反序列化为 A.class
ObjectMapper mapper = new ObjectMapper();
A a = mapper.readValue(json, A.class)
a.key
的值是多少?是 newkey
还是 key
?试图了解杰克逊如何处理冲突。我可以指定顺序吗?例如,如果 key
总是映射到 NewKey
如果 Key
和 NewKey
都存在于 json 中,我应该怎么做?
在您的示例中,您使用 @JsonAlias("Key")
和 @JsonProperty("NewKey")
的顺序取决于 JSON
负载中 key-value
对的顺序。如果您想始终使用 NewKey
键优先级进行反序列化,则需要在自定义 JSON Deserialiser
或构造函数中实现它。您可以在下面找到简单的示例:
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Collections;
import java.util.Map;
import java.util.Objects;
public class JsonApp {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.readValue("{}", A.class));
System.out.println(mapper.readValue("{\"Key\": \"key\"}", A.class));
System.out.println(mapper.readValue("{\"NewKey\": {\"value\": \"newkey\"}}", A.class));
System.out.println(mapper.readValue("{\"Key\": \"key\", \"NewKey\": {\"value\": \"newkey\"}}", A.class));
System.out.println(mapper.readValue("{\"NewKey\": {\"value\": \"newkey\"}, \"Key\": \"key\"}", A.class));
}
}
class A {
private String key;
@JsonCreator
public A(Map<String, Object> json) {
final String key = Objects.toString(json.get("Key"), null);
final Map newKey = (Map) json.getOrDefault("NewKey", Collections.emptyMap());
this.key = Objects.toString(newKey.get("value"), key);
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
@Override
public String toString() {
return key;
}
}
以上代码打印:
null
key
newkey
newkey
newkey
我有以下 class,其中 属性 "key" 映射到 2 个不同的 JSON
字段
public class A {
@JsonAlias("Key")
private String key;
@JsonProperty("NewKey")
private void unpackNewKey(Map<String, String> NewKey) {
key = NewKey.get("value");
}
}
这是要反序列化的JSON。
{
"NewKey": {
"value": "newkey",
},
"Key": "key"
}
如果我将上面的 json 反序列化为 A.class
ObjectMapper mapper = new ObjectMapper();
A a = mapper.readValue(json, A.class)
a.key
的值是多少?是 newkey
还是 key
?试图了解杰克逊如何处理冲突。我可以指定顺序吗?例如,如果 key
总是映射到 NewKey
如果 Key
和 NewKey
都存在于 json 中,我应该怎么做?
在您的示例中,您使用 @JsonAlias("Key")
和 @JsonProperty("NewKey")
的顺序取决于 JSON
负载中 key-value
对的顺序。如果您想始终使用 NewKey
键优先级进行反序列化,则需要在自定义 JSON Deserialiser
或构造函数中实现它。您可以在下面找到简单的示例:
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Collections;
import java.util.Map;
import java.util.Objects;
public class JsonApp {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.readValue("{}", A.class));
System.out.println(mapper.readValue("{\"Key\": \"key\"}", A.class));
System.out.println(mapper.readValue("{\"NewKey\": {\"value\": \"newkey\"}}", A.class));
System.out.println(mapper.readValue("{\"Key\": \"key\", \"NewKey\": {\"value\": \"newkey\"}}", A.class));
System.out.println(mapper.readValue("{\"NewKey\": {\"value\": \"newkey\"}, \"Key\": \"key\"}", A.class));
}
}
class A {
private String key;
@JsonCreator
public A(Map<String, Object> json) {
final String key = Objects.toString(json.get("Key"), null);
final Map newKey = (Map) json.getOrDefault("NewKey", Collections.emptyMap());
this.key = Objects.toString(newKey.get("value"), key);
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
@Override
public String toString() {
return key;
}
}
以上代码打印:
null
key
newkey
newkey
newkey