无法构造 `com.test.FilterModel` 的实例。没有从字符串值反序列化的字符串参数构造函数/工厂方法

Tej*_*tri 2 java jackson

我有一个杰克逊对象映射器的实现,如下所示:

public void getFilterTest(){
    String filterJSON = "{\"SelectOptions\":[{\"key\":\"status\",\"options\":[{\"sign\":\"eq\",\"value\":\"FAILED\"},{\"sign\":\"eq\",\"value\":\"ESCALATED\"}]}]}";
    ObjectMapper objectMapper = new ObjectMapper();
    FilterModel filters = null;
    try {
        filters = objectMapper.convertValue(filterJSON, FilterModel.class);
    }catch(Exception e) {
        e.printStackTrace();
    }
    assertNotNull(filters);}
Run Code Online (Sandbox Code Playgroud)

在执行 convertValue 时,我收到以下错误:

java.lang.IllegalArgumentException:无法构造的实例 com.Test.FilterModel(尽管至少存在一个 Creator):没有从字符串值反序列化的字符串参数构造函数/工厂方法 ('{"SelectOptions":[{"key":"status","options":[{"sign":" eq","value":"FAILED"},{"sign":"eq","value":"ESCALATED"}]}]}') 在 [来源:未知;行:-1,列:-1] 在 com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:3750) 在 com.fasterxml.jackson.databind.ObjectMapper.convertValue(ObjectMapper.java:3668) 在 com .test.util.TestUnitCPIODataUtil.getFilterTest(TestUnitCPIODataUtil.java:71) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect。 com.test.FilterModel(尽管至少存在一个 Creator):没有从字符串值反序列化的字符串参数构造函数/工厂方法 ('{"SelectOptions":[{"key":"status","options":[{"sign":" eq","value":"FAILED"},{"sign":"eq","value":"ESCALATED"}]}]}') 在 [来源:未知;行:-1,列:-1] 在 com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63) 在 com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1343)在 com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1032) 在 com.fasterxml.jackson.databind.deser.ValueInstantiator。

这是我的模型类:过滤器模型:

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"SelectOptions"
})
public class FilterModel {

@JsonProperty("SelectOptions")
private List<SelectOption> selectOptions = null;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

@JsonProperty("SelectOptions")
public List<SelectOption> getSelectOptions() {
return selectOptions;
}

@JsonProperty("SelectOptions")
public void setSelectOptions(List<SelectOption> selectOptions) {
this.selectOptions = selectOptions;
}

@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}

@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}

}
Run Code Online (Sandbox Code Playgroud)

SelectOptions 类:

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"key",
"options"
})
public class SelectOption {

@JsonProperty("key")
private String key;
@JsonProperty("options")
private List<Option> options = null;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

@JsonProperty("key")
public String getKey() {
return key;
}

@JsonProperty("key")
public void setKey(String key) {
this.key = key;
}

@JsonProperty("options")
public List<Option> getOptions() {
return options;
}

@JsonProperty("options")
public void setOptions(List<Option> options) {
this.options = options;
}

@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}

@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}

}
Run Code Online (Sandbox Code Playgroud)

选项模型类:

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"sign",
"value"
})
public class Option {

@JsonProperty("sign")
private String sign;
@JsonProperty("value")
private String value;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

@JsonProperty("sign")
public String getSign() {
return sign;
}

@JsonProperty("sign")
public void setSign(String sign) {
this.sign = sign;
}

@JsonProperty("value")
public String getValue() {
return value;
}

@JsonProperty("value")
public void setValue(String value) {
this.value = value;
}

@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}

@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}

}
Run Code Online (Sandbox Code Playgroud)

我在其他问题上尝试了几种解决方案,但找不到解决方案。似乎整个 JSON 字符串都被视为普通字符串。但是,我不确定如何解决这个问题。我需要 FilterModel 类,因为我期望有 1 个以上的参数,这与上述测试用例中的字符串不同。

mfe*_*mfe 5

您应该调用readValue方法。

filters = objectMapper.readValue(filterJSON, FilterModel.class);
Run Code Online (Sandbox Code Playgroud)