java - Jackson 方法中的只读属性

标签 java json jackson jax-rs

我需要在 json 中公开一个属性,该属性将在 getter 方法中进行处理。

类(class):

public class Configuracao{

   private String departamento;

   public String getDepartamento(){/**getter code**/}

   public void setDepartamento(String departamento){/**setter code**/}

   public String getDepartamentos(){/***Some logic code***/}

}

前面拿到的json:{departamento: "Lote", departamentos: "Lotes"}

在序列化中工作正常,但是当我的前端将 json 发回时,jackson 抛出由“departamentos”引起的无法识别的字段异常。我怎么知道我只想通过方法值序列化“departamentos”并在反序列化中被忽略。我在该方法上尝试了 @JsonIgnoreProperty@JsonGetter@JsonProperty(access = JsonProperty.Access.READ_ONLY) 但没有任何效果。

最佳答案

您可以使用JsonIgnoreProperties注释:

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.concurrent.ThreadLocalRandom;

public class JsonPathApp {

    public static void main(String[] args) throws Exception {
        Configuracao c = new Configuracao();
        c.setDepartamento("D1");

        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(c);
        System.out.println(json);
        System.out.println(mapper.readValue(json, Configuracao.class));
    }
}

@JsonIgnoreProperties(ignoreUnknown = true)
class Configuracao {

    private String departamento;

    public String getDepartamento() {
        return departamento;
    }

    public void setDepartamento(String departamento) {
        this.departamento = departamento;
    }

    public String getDepartamentos() {
        return departamento + " " + ThreadLocalRandom.current().nextDouble();
    }

    @Override
    public String toString() {
        return "Configuracao{" +
                "departamento='" + departamento + '\'' +
                '}';
    }
}

上面的代码打印:

{"departamento":"D1","departamentos":"D1 0.8600092703789755"}
Configuracao{departamento='D1'}

JsonProperty.Access.READ_ONLY 也应该有效:

class Configuracao {

    private String departamento;

    public String getDepartamento() {
        return departamento;
    }

    public void setDepartamento(String departamento) {
        this.departamento = departamento;
    }

    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    public String getDepartamentos() {
        return departamento + " " + ThreadLocalRandom.current().nextDouble();
    }

    @Override
    public String toString() {
        return "Configuracao{" +
                "departamento='" + departamento + '\'' +
                '}';
    }
}

上述测试按预期工作。

如果您有更多这样的类和要忽略的字段,您可以禁用全局功能DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES:

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

所有内容均已使用版本 2.9.9 进行了测试

关于java - Jackson 方法中的只读属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58567637/

相关文章:

java - Apache Pig 分配和解析计数问题

java - 更改 JComponent 的属性

JSON 从字符串到 float 的转换值

java - 使用 RestTemplate 时出错 - 使用 Apache Commons Multimap 反序列化对象时出现问题

java - 如何将 32 位 int 移位 32(再次)

java - 如何通过单击列表中经过适配器的项目来调用插页式广告?

sql - PostgreSQL 可以在 jsonb 数组对象上加入吗?

java - 在 Spring MVC 中使用 Jackson 将 Map 序列化为一对数组

android - 如何更改 Robospice/Jackson 中的根 JSON 数组元素名称?

java - 如何使用 jackson 从嵌套的 Json 字符串中获取 2 个值