使用以下代码使用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