如果Json与预期的对象结构不匹配,则通知Jackson抛出异常



使用以下代码使用Jackson注释将Json转换为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);
}

我希望抛出一个异常,因为RequestJava对象不包含字段类型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;
}

失败_ON_UNKNOWN_PROPERTIES

确定是否遇到未知属性的功能(不映射到财产的,并且没有"任何setter"的(或可以处理它的处理程序(应该导致失败(通过抛出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

定义是否可以忽略任何无法识别的属性属性。

如果为true,则所有无法识别的属性——也就是说,没有接受它们的setter或创建者--被忽略而不发出警告(尽管未知属性的处理程序(如果有的话(仍然是调用(。

对序列化没有任何影响

默认值:错误

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

最新更新