我在使用 Jackson 反序列化 JSON 字符串时遇到问题。我收到错误:com.fasterxml.jackson.databind.JsonMappingException:找不到类型[简单类型,类RatingDMO]的合适构造函数:无法从 JSON 对象实例化(需要添加/启用类型信息?)
我将字段映射到 JSON 文件,并且它的参数可作为属性使用并且具有相同的类型。
注意:- 如果我提供无参数构造函数(仅用于检查它是否有效),则测试有效。
我无法在代码中提供/保留默认构造函数,因为模型中的最终字段很少。
mapper.readValue(new File("RatingRequest.json"),RatingDMO.class);
POJO 类:
public class RatingDMO implements Serializable {
private static final long serialVersionUID = -433016040176969496L;
private String company;
private String state;
private String lob;
private String channel;
private String username;
private String password;
private String policyNumber;
private long policyKey;
private String transactionType;
private String evaluationType;
private String clientID;
private String policyTerm;
private String effectiveDate;
private String policyXML;
private String webXML;
private String firstName;
private String lastName;
private String businessName;
private String city;
private String zip;
private String effectiveDtStart;
private String effectiveDtEnd;
private String searchType;
private String uuid;
private List<String> policyStatusCodes;
private Map<String,String> eAdvisorCoverages;
private Map<String,String> customCoverages;
private Map<String,String> defaultCoverages;
private String action;
private String type;
private String selectedCoverage;
private boolean motorClubMember;
private String selectedSubCoveres;
private boolean customRated;
private final PolicyDMO policyDMO;
private final String allInsuredInd;
private final String medicareMediaidInd;
private final boolean driversGreaterthan65;
public PolicyRatingRequestDMO(PolicyDMO policyDMO, String allInsuredInd, String medicareMediaidInd, boolean driversGreaterthan65){
this.policyDMO = policyDMO;
this.allInsuredInd = allInsuredInd;
this.medicareMediaidInd = medicareMediaidInd;
this.driversGreaterthan65 = driversGreaterthan65;
}
... }
默认情况下,Jackson 的数据绑定将尝试使用无参构造函数构造一个对象,然后从 JSON 的相应位填充该对象的属性。您可以使用注释覆盖此行为
@JsonCreator
public PolicyRatingRequestDMO(@JsonProperty("policyInfo") PolicyDMO policyDMO,
@JsonProperty("allInsuredInd") String allInsuredInd,
@JsonProperty("medicareMediaidInd") String medicareMediaidInd,
@JsonProperty("driversGreaterThan65") boolean driversGreaterthan65){
this.policyDMO = policyDMO;
this.allInsuredInd = allInsuredInd;
this.medicareMediaidInd = medicareMediaidInd;
this.driversGreaterthan65 = driversGreaterthan65;
}
JsonCreator
注释告诉Jackson要调用哪个构造函数,其参数用JsonProperty
注释以指示JSON中的哪些属性对应于构造函数中的哪些参数。 JSON 中与构造函数参数不对应的其他属性将像平常一样通过 setter 或直接字段访问注入。