当前位置: 首页 > 知识库问答 >
问题:

当对象变量设置为Private时,Jackson ObjectMapper返回null

东郭骁
2023-03-14

我得到了这个转义的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的变量,那么调用getter时,我将获得相应的值。Data类中设置为private的变量,那么调用getter时将得到null

getter和setter总是公共的。

共有1个答案

康鹏云
2023-03-14

问题是,Jackson总是假设setsuccess()&getsuccess()将用于success字段,而不是success@jsonproperty需要支持以大写字母开头的JSON字段名。Java有一个惯例,其中类成员总是以小写字母开头,您可以通过使用这个注释来实现这一点。

当您将字段private设置为private时,您会强制Jackson使用设置器,而上述冲突使得无法正确反序列化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 []
 类似资料:
  • 如果有文件,则显示带有下载元素的task1; task2带有一个上传输入文件元素和一个approve或not(approved)变量;注意,我可以在下一个任务(例如task03)下载文件,但不能在上一个任务下载 批准=false; task1使用file_task2变量显示下载元素;这里是问题

  • 我试图在流量为空时返回404,类似于这里:WebFlux Functional:如何检测空流量并返回404? 我主要担心的是,当你检查通量是否有元素时,它会发出那个值,而你却松开了它。当我尝试使用switch时,如果服务器响应为空,它就永远不会被调用(我暗暗认为这是因为单声道不是空的,只有主体是空的)。 是否有一种方法可以恢复hasElements中发出的元素,或者让switchIfEmpty只检

  • 我在JavaScript中构建一些对象,并将这些对象推送到一个数组中,我将要使用的键存储在一个变量中,然后创建我的对象,如下所示: 但是,当我尝试检查每个对象的对象数组时,键是“key”,而不是变量键的值。有没有办法从变量中设置键的值? 为了更好地解释,请拨弄:http://jsfiddle.net/Fr6eY/3/

  • 问题内容: 我试图获取通过终端机(Mac)设置的环境变量的值,同时还在.bash_profile文件中设置该变量并重新加载。这样做之后,我回显了该值,并在终端上打印了正确的值。尝试检索变量的值时(我确保在.bash_profile文件中以及在使用时都使用了正确的名称。 在下面的代码中,我用 VAR_NAME 替换了变量的名称: 在我的.bash_profile中: 当我打印出的值时,将打印“ nu

  • 问题内容: 使用plpgsql过程提取一条记录(如果存在),然后提取一条记录(对它进行处理)。 变量是行类型: 我用一条SQL语句填充它: 我知道肯定有这样的行: 返回值: 但是,现在我想测试一下,如果条件失败,它是否同时具有这些记录和记录: 这些加薪都没有出现在我的消息日志中-它从未进入过障碍。测试您是否收到来自a的行的正确方法是什么? 问题答案: 我看到两个可能的原因,为什么… 这些加薪都没有