У меня есть реализация с Jackson Object mapper следующим образом:
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
(хотя существует хотя бы один создатель): нет конструктора аргумента String / метода фабрики для десериализации из значения String ('{"SelectOptions": [{"key": "status", "options": [{"sign": "eq", "value": "FAILED"}, {"sign": "eq", "value": "ESCALATED"}]}]} ') в [Source: UNKNOWN;строка: -1, столбец: -1] в com.fasterxml.jackson.databind.ObjectMapper._convert (ObjectMapper.java:3750) в com.fasterxml.jackson.databind.ObjectMapper.convertValue (ObjectMapper.java:3668) в com.test.util.(DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke (Method.java:498) в org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall (FrameworkMethod.java:50) в org..runners.model.ReflectiveCallable.run (ReflectiveCallable.java:12) в org.junit.runners.model.FrameworkMethod.invokeExplosively (FrameworkMethod.java:47) в org.junit.internal.runners.Methoho ().java: 17) at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate (RunBeforeTestExecutionCallbacks.java:74) в org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate (RunAfterTestExecutionCallbacks.java:84) в org.junit.internal.runners.statefore:e.ej ()в org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate (RunBeforeTestMethodCallbacks.java:75) в org.springframework.test.context.junit4.statements.RunAfteralljj.test.context.junit4.statements.(SpringJUnit4ClassRunner.java:251) в org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild (SpringJUnit4ClassRunner.java:97) в org.junit.runners.ParentRunava.jr2.runners.ParentRunner $ 1.schedule (ПаrentRunner.java:71) в org.junit.runners.ParentRunner.runChildren (ParentRunner.java:288) в org.junit.runners.ParentRunner.access $ 000 (ParentRunner.java:58) в org.junit.runners.Parent(0internal.junit4.runner.JUnit4TestReference.run (JUnit4TestReference.java:86) в org.eclipse.jdt.internal.junit.runner.TestExecution.run (TestExecution.java:38) в org.eclipse.jdt.ternal.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:538) в org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java: 760) на org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run (RemoteTestRunner.java:460) на org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main (RemoteTestRunner.main)Вызвано: com.fasterxml.jackson.databind.exc.MismatchedInputException: невозможнопостроить экземпляр
com.test.FilterModel
(хотя в
существует хотя бы один создатель): нет конструктора / фабрики с аргументом строки
метод десериализации из строкового значения
( "{ "Выберите Функции": [{ "ключ": "Статус", "варианты": [{ "знак": "эк", "значение": "FAILED"}, { "знак": "эк",» значение ":" эскалация "}]}]} ')
в [Источник: НЕИЗВЕСТНО; строка: -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._createFromStringFallbacks (ValueInstantiator.java:371)
в
com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromString (StdValueInstantiator.java:323)
в
com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString (BeanDeserializerBase.java:1373)
в
com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther (BeanDeserializer.java:171)
в
com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize (BeanDeserializer.java:161)
в
com.fasterxml.jackson.databind.ObjectMapper._convert (ObjectMapper.java:3745)
... еще 34
Вот мои классы моделей:
Модель фильтра:
@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, так как я ожидаю более 1 параметра, в отличие от строки в приведенном выше тестовом примере.