Я пытаюсь проанализировать параметры фильтра, отправленные сетью KendoUI, на мой веб-сервис, и у меня есть некоторые проблемы, которые убеждают Джексона разобрать этот JSON. Насколько я знаю, я могу управлять форматом параметров, которые отправляет Kendo, но я не знаю, как бы я сделал маршалирование параметров в более удобный формат, чтобы они оставались неизменными на данный момент.Jackson: десериализация рекурсивного объекта
Я намерен преобразовать эти параметры в запрос SQL для базы данных Oracle.
Пример JSON:
{
"filters":
[
{
"field": "Name",
"operator": "contains",
"value": "John"
},
{
"filters": [
{
"field": "Age",
"operator": "gt",
"value": 20
},
{
"field": "Age",
"operator": "lt",
"value": 85
}
],
"logic", "and"
},
{
"field": "Address",
"operator": "doesnotcontain",
"value": "street"
}
],
"logic": "or"
}
Фильтры. Java
public class Filters {
private List<Filter> filters;
private String logic;
// accessors/mutators/toString
}
Filter.java
public class Filter {
private String field;
private String operator;
private String value;
// accessors/mutators/toString
}
Unit Test
public class KendoGridFilterTest {
private ObjectMapper mapper;
@Before
public void before() {
mapper = new ObjectMapper();
}
@Test
public void jsonParseTest() {
final String json = "{\"filters\":[{\"field\":\"Name\",\"operator\":\"contains\",\"value\":\"John\"},{filters: [{\"field\":\"Age\",\"operator\": \"eq\",\"value\": 85},{\"field\": \"Age\",\"operator\": \"eq\",\"value\": 85}]\"logic\", \"and\",},{\"field\": \"Address\",\"operator\": \"doesnotcontain\",\"value\": \"street\"}],\"logic\":\"or\"}";
Filters filters = mapper.readValue(json, Filters.class);
assertTrue(json.equals(filters.writeValueAsString(filters);
}
}
Ошибки
com.fasterxml.jackson.databind.UnrecognizedPropertyException: Unrecognized field 'logic'(com.example.Filter) not market as ignorable (3 known properties "value", "field", "operator") at [Source: [email protected]; line: 1, column 76] (through reference chain: com.example.Filters["filters"]->com.example.Filter["logic"]
Я также попытался добавить @JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id")
к классу фильтров и получить то же самое ошибки.
Похоже, может быть, класс 'Filters' должен также содержать' Filters' в качестве члена также, так как внешние «фильтры» выглядит как есть еще один «фильтр» объект внутри него (хотя это странно, что за пределами у кого есть цитаты, а внутри нет). – kuporific
Я исправил упущение котировок. Проблема, которую я вижу, состоит в том, что родительский и дочерний объекты имеют одно и то же имя, поэтому я не могу вернуть ключ «фильтры», если переменная не названа «фильтрами» (или переназначена с помощью @JsonProperty (значение = «фильтры») Я думаю, что я немного запутался в рекурсивном характере этого JSON. – johnktims
У вас есть геттер и сеттер для каждого частного поля? –