【问题标题】:Inform Jackson to throw exception if Json does not match expected object structure如果 Json 与预期的对象结构不匹配,则通知 Jackson 抛出异常
【发布时间】:2022-02-04 09:39:19
【问题描述】:

使用此代码将 Json 转换为使用 Jackson 注释的 Java 对象:

import com.fasterxml.jackson.databind.ObjectMapper;
import objectmappertest.Request;
import java.io.IOException;

    public static void main(String args[]) throws IOException {
        final String json  = "{\"datePurchased\":\"2022-02-03 21:32:017\"},{\"unknownField\":\"test\"}";
        final Request request = mapper.readValue(json, Request.class);
        System.out.println("request : "+request);
    }

我希望抛出异常,因为 Request Java 对象不包含字段类型 unknownField ,相反,Jackson 似乎从 JSON 中解析了它可以解析的内容。如果传递给 Jackson 的 Json 与 Java 对象结构不匹配,是否有配置选项导致异常或设置标志?

这是预期的结构:

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.extern.jackson.Jacksonized;
import java.util.Date;

@Builder
@ToString
@Getter
@Setter
@Jacksonized
public class Request
{
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:sss")
    private final Date datePurchased;
}
 

【问题讨论】:

    标签: java json jackson


    【解决方案1】:

    FAIL_ON_UNKNOWN_PROPERTIES

    判断是否遇到未知属性的功能 (那些不映射到属性,并且没有“任何设置器”或 可以处理它的处理程序)应该导致失败(通过抛出一个 JsonMappingException) 与否。

    使用示例:

       ObjectMapper mapper  = new ObjectMapper();
       mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);
    

    文档:

    https://fasterxml.github.io/jackson-databind/javadoc/2.6/com/fasterxml/jackson/databind/DeserializationFeature.html


    您还可以在 POJO 本身的顶部使用注释 @JsonIgnoreProperties:但是我不太确定这是否会自行引发异常。

    @Target(value={ANNOTATION_TYPE,TYPE,METHOD,CONSTRUCTOR,FIELD})
    @Retention(value=RUNTIME)
    public @interface JsonIgnoreProperties
    Annotation that can be used to either suppress serialization of properties (during serialization), or ignore processing of JSON properties read (during deserialization).
    

    例子:

     // To throw exception on any unknown properties in JSON input:
     @JsonIgnoreProperties
     public class YourPoJo{
            
     }
    

    public abstract boolean ignoreUnknown
    

    定义是否可以忽略任何无法识别的属性 反序列化期间的属性。

    如果为真,则所有无法识别的属性——也就是说,没有 接受它们的设置者或创建者——在没有警告的情况下被忽略 (尽管未知属性的处理程序,如果有的话,仍然是 调用)无一例外。

    对序列化没有任何影响。

    默认值:假

    文档:http://fasterxml.github.io/jackson-annotations/javadoc/2.7/com/fasterxml/jackson/annotation/JsonIgnoreProperties.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 2017-01-12
      相关资源
      最近更新 更多