13

我有一个带有以下注释的类:

class A {
public Map<String,List<String>> references;

@JsonProperty
public Map<String,List<String>> getReferences() {
...
}

@JsonIgnore
public void setReferences(Map<String,List<String>>) {
}
...
}
}

我尝试的是忽略反序列化的 json。但它不起作用。总是当 JSON 字符串到达​​ Jackson 库时填充引用属性。如果我只使用 @JsonIgnore 注释,则 getter 不起作用。这个问题有什么解决方案吗?

谢谢

4

5 回答 5

16

我认为有两个关键部分应该使您能够根据需要拥有“只读集合”。首先,除了忽略 setter 之外,请确保您的字段也标有@JsonIgnore

class A {

  @JsonIgnore
  public Map<String,List<String>> references;

  @JsonProperty
  public Map<String,List<String>> getReferences() { ... }

  @JsonIgnore
  public void setReferences(Map<String,List<String>>) { ... }

}

其次,为了防止 getter 被用作 setter,请禁用该USE_GETTERS_AS_SETTERS功能:

ObjectMapper mapper = new ObjectMapper();
mapper.disable(MapperFeature.USE_GETTERS_AS_SETTERS);
于 2013-02-11T23:59:01.067 回答
12

从 Jackson 2.6 开始,使用JsonProperty#access()注释定义read-only和改进了一种新的方法。建议不要使用单独的和注释。write-onlyJsonIgnoreJsonProperty

@JsonProperty(access = JsonProperty.Access.READ_ONLY)
public Map<String,List<String>> references;
于 2018-02-13T08:54:03.193 回答
5

您必须确保在字段级别以及 setter 上有 @JsonIgnore 注释,并且在 getter 上使用 @JsonProperty 注释。

public class Echo {

    @Null
    @JsonIgnore
    private String doNotDeserialise;

    private String echo;

    @JsonProperty
    public String getDoNotDeserialise() {
        return doNotDeserialise;
    }

    @JsonIgnore
    public void setDoNotDeserialise(String doNotDeserialise) {
        this.doNotDeserialise = doNotDeserialise;
    }

    public String getEcho() {
        return echo;
    }

    public void setEcho(String echo) {
        this.echo = echo;
    }
}

@Controller
public class EchoController {

@ResponseBody
@RequestMapping(value = "/echo", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE)
    public Echo echo(@RequestBody @Valid Echo echo) {
        if (StringUtils.isEmpty(echo.getDoNotDeserialise())) {
            echo.setDoNotDeserialise("Value is set by the server, not by the client!");
        }

        return echo;
    }
}
  • 如果您提交一个 JSON 请求,其中设置了“doNotDeserialise”值,那么当 JSON 反序列化为一个对象时,它将被设置为 null(如果不是,我在该字段上放置了一个验证约束,所以它会出错)
  • 如果您将“doNotDeserialise”值设置为服务器上的某个值,那么它将被正确序列化为 JSON 并推送到客户端
于 2014-08-06T23:58:29.367 回答
3

@JsonIgnore在我的 getter 上使用它,但它不起作用,我无法配置映射器(我使用的是 Jackson Jaxrs 提供程序)。这对我有用:

@JsonIgnoreProperties(ignoreUnknown = true, value = { "actorsAsString",
    "writersAsString", "directorsAsString", "genresAsString" }) 
于 2015-04-03T23:27:07.477 回答
0

我只能想到一个非杰克逊解决方案,使用没有映射引用的基类,然后转换为实际类:

// expect a B on an incoming request
class B {
// ...
}

// after the data is read, cast to A which will have empty references
class A extends B {
public Map<String,List<String>> references;
}

如果您不想要它们,为什么还要发送参考文献?

还是传入数据不在您的手中,而您只是想避免映射异常告诉您杰克逊找不到要为传入引用设置的属性?为此,我们使用所有 Json 模型类都继承的基类:

public abstract class JsonObject {

    @JsonAnySetter
    public void handleUnknown(String key, Object value) {

        // for us we log an error if we can't map but you can skip that
        Log log = LogFactory.getLog(String.class);    
        log.error("Error mapping object of type: " + this.getClass().getName());    
        log.error("Could not map key: \"" + key + "\" and value: \"" + "\"" + value.toString() + "\"");

    }

然后在你添加的 POJO@JsonIgnoreProperties中,传入的属性将被转发到handleUnknown()

@JsonIgnoreProperties
class A extends JsonObject {
    // no references if you don't need them
}

编辑

这个 SO Thread描述了如何使用 Mixins。如果您想保持结构原样,这可能是解决方案,但我还没有尝试过。

于 2012-09-26T06:17:30.740 回答