JacksonObjectMapper不会反序列化小写字符串

gywdnpxw  于 2022-11-08  发布在  其他
关注(0)|答案(2)|浏览(144)

我有一个json作为字符串:

{
    "passnummer": "passnummer",
    "nummerDesAufenthaltstitels": "nummerDesAufenthaltstitels",
    "ppkNummer": "ppkNummer",
    "fingerabdruckreferenznummer": "fingerabdruckreferenznummer"
}

对于单词的分离没有一致性,这意味着一些键是 Camel 式的,而一些不是。2我对此没有影响。3我不能改变模型。
我必须将这个字符串读入Java对象。我对Java模型也没有影响,所以我不能向模型的字段添加@JsonProperty或@JsonAlias注解或任何其他内容。
因此,java模型看起来如下:

public static class Request {
    protected String passnummer;
    protected String nummerDesAufenthaltstitels;
    protected String ppkNummer;
    protected String fingerabdruckreferenznummer;

    public String getPassnummer() {
      return this.passnummer;
    }

    public void setPassnummer(String value) {
      this.passnummer = value;
    }

    public String getNummerDesAufenthaltstitels() {
      return this.nummerDesAufenthaltstitels;
    }

    public void setNummerDesAufenthaltstitels(String value) {
      this.nummerDesAufenthaltstitels = value;
    }

    public String getPpkNummer() {
      return this.ppkNummer;
    }

    public void setPpkNummer(String value) {
      this.ppkNummer = value;
    }

    public String getFingerabdruckreferenznummer() {
      return this.fingerabdruckreferenznummer;
    }

    public void setFingerabdruckreferenznummer(String value) {
      this.fingerabdruckreferenznummer = value;
    }
}

当我将json反序列化为java对象并打印值时:

Request request = objectmapper.readValue(jsonPayload, Request.class);

System.out.println("passnummer: " + request.getPassnummer());
System.out.println("nummerDesAufenthaltstitels: " + request.getNummerDesAufenthaltstitels());
System.out.println("ppkNummer: " + request.getPpkNummer());
System.out.println("fingerabdruckreferenznummer: " + request.getFingerabdruckreferenznummer());

我得到如下结果:

passnummer: passnummer
nummerDesAufenthaltstitels: nummerDesAufenthaltstitels
ppkNummer: ppkNummer
fingerabdruckreferenznummer: null

所以我的问题是:为什么objectMapper不能反序列化fingerabdruckreferenznummer

编辑

对象Map器配置:

public ObjectMapper objectMapper() {
    final ObjectMapper objectMapper = new ObjectMapper();
    final SimpleModule module = new SimpleModule();

    module.addSerializer(TeilbekanntesDatumMitUnbekannt.class, new DateSerializer());

    objectMapper.registerModule(module);
    objectMapper.registerModule(new JavaTimeModule());
    objectMapper.registerModule(new JaxbAnnotationModule());
    objectMapper.configure(WRITE_DATES_AS_TIMESTAMPS, false);

    objectMapper.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);
    objectMapper.setVisibility(objectMapper.getSerializationConfig().getDefaultVisibilityChecker()
        .withFieldVisibility(JsonAutoDetect.Visibility.ANY)
        .withGetterVisibility(JsonAutoDetect.Visibility.NONE)
        .withSetterVisibility(JsonAutoDetect.Visibility.NONE)
        .withCreatorVisibility(JsonAutoDetect.Visibility.NONE));

    return objectMapper;
  }

编辑2

如果我使用play new ObjectMapper(),则会得到:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "fingerabdruckreferenznummer"
vmdwslir

vmdwslir1#

使用您的ObjectMapper(除了您没有发布的部分)和以下代码,结果如预期:
编号

final ObjectMapper objectMapper = new ObjectMapper();
    final SimpleModule module = new SimpleModule();
    //        module.addSerializer(TeilbekanntesDatumMitUnbekannt.class, new DateSerializer());
    //            objectMapper.registerModule(new JaxbAnnotationModule());

    objectMapper.registerModule(module);
    objectMapper.registerModule(new JavaTimeModule());
    objectMapper.configure(WRITE_DATES_AS_TIMESTAMPS, false);

    objectMapper.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);
    objectMapper.setVisibility(objectMapper.getSerializationConfig().getDefaultVisibilityChecker()
            .withFieldVisibility(JsonAutoDetect.Visibility.ANY)
            .withGetterVisibility(JsonAutoDetect.Visibility.NONE)
            .withSetterVisibility(JsonAutoDetect.Visibility.NONE)
            .withCreatorVisibility(JsonAutoDetect.Visibility.NONE));

    final String jsonPayload = """
             {
                 "passnummer": "1passnummer",
                 "nummerDesAufenthaltstitels": "2nummerDesAufenthaltstitels",
                 "ppkNummer": "3ppkNummer",
                 "fingerabdruckreferenznummer": "4fingerabdruckreferenznummer"
             }               
            """;
    final Request request = objectMapper.readValue(jsonPayload, Request.class);

    System.out.println("passnummer: " + request.getPassnummer());
    System.out.println("nummerDesAufenthaltstitels: " + request.getNummerDesAufenthaltstitels());
    System.out.println("ppkNummer: " + request.getPpkNummer());
    System.out.println("fingerabdruckreferenznummer: " + request.getFingerabdruckreferenznummer());

结果

passnummer: 1passnummer
nummerDesAufenthaltstitels: 2nummerDesAufenthaltstitels
ppkNummer: 3ppkNummer
fingerabdruckreferenznummer: 4fingerabdruckreferenznummer

因此,要么您的json-payload不同,要么您的objectmapper有一些附加配置。

vyu0f0g1

vyu0f0g12#

ObjectMapper可以配置为筛选出某些字段。创建您自己的ObjectMapper或确保您知道配置了什么。这可以使用Mixin完成。

this.objectMapper = objectMapper.addMixIn(Request.class, MyMixin.class);

@JsonIgnoreProperties({"fingerabdruckreferenznummer", "field2"})
private interface MyMixin {}

相关问题