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

3

我有一个使用Jackson对象映射器的实现,如下所示:

Original Answer翻译成"最初的回答"

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);}

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

java.lang.IllegalArgumentException: 无法构造com.Test.FilterModel类的实例(即使存在至少一个创建者):没有从字符串值('{"SelectOptions":[{"key":"status","options":[{"sign":"eq","value":"FAILED"},{"sign":"eq","value":"ESCALATED"}]}]}')反序列化的String-argument构造函数/工厂方法 [来源: UNKNOWN; 行数: -1, 列数: -1] 原因: com.fasterxml.jackson.databind.exc.MismatchedInputException: 不能构造com.test.FilterModel类的实例(即使存在至少一个创建者):没有从字符串值('{"SelectOptions":[{"key":"status","options":[{"sign":"eq","value":"FAILED"},{"sign":"eq","value":"ESCALATED"}]}]}')反序列化的String-argument构造函数/工厂方法 [来源: UNKNOWN; 行数: -1, 列数: -1]
这是我的模型类: 筛选器模型:
@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);
}

}

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);
}

}

选项模型类:

@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);
}

}

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

最初的回答:我尝试了其他问题上的几种解决方案,但是无法解决。似乎整个JSON字符串被视为普通字符串。但是,我不确定如何解决这个问题。我需要FilterModel类,因为我希望有多个参数,而不像上面测试用例中的字符串那样只有一个参数。
2个回答

8
您应该调用readValue方法。
filters = objectMapper.readValue(filterJSON, FilterModel.class);

0
final List<Object> providers = new ArrayList<Object>();

JacksonJaxbJsonProvider jacksonJsonProvider = new JacksonJaxbJsonProvider();
        providers.add( jacksonJsonProvider );

WebClient client =  WebClient.create(node + updateCacheNodeUrl, providers);
                      client.type("application/json").accept("application/json")
try {
                            ObjectMapper objectMapper = new ObjectMapper();
                            
                            objectMapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
                            String serialisedJson = objectMapper.writeValueAsString(replicateCacheDto);
                            ReplicateCacheDto objReplicateCacheDto = objectMapper.readValue(serialisedJson, ReplicateCacheDto.class);
                            System.out.println("objReplicateCacheDto.toString = " + objReplicateCacheDto.toString());
                            
                            client.put(objReplicateCacheDto);
                        } catch (JsonParseException e) {
                            e.printStackTrace();
                        }
                      catch (Exception e) {
                            e.printStackTrace();
                        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接