gpt4 book ai didi

java - 当 Object 变量设置为 Private 时,Jackson ObjectMapper 返回 null

转载 作者:行者123 更新时间:2023-11-30 06:40:25 32 4
gpt4 key购买 nike

我得到了这个转义的 JSON

"{\"UniqueId\":[],\"CustomerOffers\":{},\"Success\":false,\"ErrorMessages\":[\"Test Message\"],\"ErrorType\":\"GeneralError\"}"

我需要使用 Jackson 将其转换为 Java 对象。

// https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind
compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.8'

我创建了类:

public class Data {

private List<UUID> UniqueId;
private Map<Integer, List<Integer>> CustomerOffers;
private Boolean Success;
private List<String> ErrorMessages;
private String ErrorType;

// getter, setters
}

然后我创建了转换它的方法

public class Deserializing {

public void processing(String input) {

ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);



String jsonInString = "\"{\"UniqueId\":[],\"CustomerOffers\":{},\"Success\":false,\"ErrorMessages\":[\"Test Message\"],\"ErrorType\":\"GeneralError\"}\"";
String newJSON = org.apache.commons.lang3.StringEscapeUtils.unescapeJava(jsonInString);
newJSON= newJSON.substring(1, jsonInString.length()-1);


try {
// JSON string to Java object
Data data = mapper.readValue(newJSON, Data.class);
System.out.println(data);

System.out.println("Get Success "+ data.getSuccess()); // return "false" if Data object is public ; null if private
System.out.println("Get UniqueID " + data.getUniqueId()); // return [] if Data object is public ; null if private

} catch (IOException e) {
e.printStackTrace();
}
}
}

无论Data类中的哪个变量设置为public,那么我在调用getters的时候就会得到对应的值。无论 Data 类中的哪个变量设置为私有(private),当我调用 getter 时我将得到 null

Getter 和 Setter 总是公开的。

我想知道,为什么 ObjectMapper 不能映射对象,如果它被设置为私有(private)?我可以将其设置为公开,但这不是最佳做法。

最佳答案

问题是 Jackson 将始终假定 setSuccess() & getSuccess() 将用于 success 字段,而不是 成功@JsonProperty需要支持以大写字母开头的JSON字段名. Java 有一个约定,类成员总是以小写字母开头,您可以通过使用此注释来实现这一点。

当您将字段设置为private 时,您会强制 Jackson 使用 setter,并且上述冲突使得无法正确反序列化 Data 对象。

解决办法是做;

public class Data {

@JsonProperty("UniqueId")
private List<UUID> uniqueId;
@JsonProperty("CustomerOffers")
private Map<Integer, List<Integer>> customerOffers;
@JsonProperty("Success")
private Boolean success;
@JsonProperty("ErrorMessages")
private List<String> errorMessages;
@JsonProperty("ErrorType")
private String errorType;

// getter&setters
}

然后您将看到正确反序列化为 Java 对象的值;

Get success false
Get uniqueID []

关于java - 当 Object 变量设置为 Private 时,Jackson ObjectMapper 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58110281/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com