Свойство только для чтения Джексона в методе - PullRequest
1 голос
/ 26 октября 2019

Мне нужно предоставить свойство в моем json, которое будет обрабатываться в методе получения.

Класс:

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 back, Джексон генерирует неопознанное исключение для поля, вызванное «departamentos». Как я могу сказать, что я просто хочу, чтобы «departamentos» сериализовался по значению метода и игнорировался при десериализации. Я пытался @JsonIgnoreProperty, @JsonGetter и @JsonProperty(access = JsonProperty.Access.READ_ONLY) на метод, но ничего не работает.

Ответы [ 2 ]

0 голосов
/ 26 октября 2019

Вы можете использовать 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

0 голосов
/ 26 октября 2019

Просто определите departamentos свойство в Configuracao классе.

public class Configuracao{
   private String departamento;
   private String departamentos;
   //omitted getter/setter
}
...