2013-07-12 8 views
4

Я пытаюсь проанализировать параметры фильтра, отправленные сетью 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") к классу фильтров и получить то же самое ошибки.

+0

Похоже, может быть, класс 'Filters' должен также содержать' Filters' в качестве члена также, так как внешние «фильтры» выглядит как есть еще один «фильтр» объект внутри него (хотя это странно, что за пределами у кого есть цитаты, а внутри нет). – kuporific

+0

Я исправил упущение котировок. Проблема, которую я вижу, состоит в том, что родительский и дочерний объекты имеют одно и то же имя, поэтому я не могу вернуть ключ «фильтры», если переменная не названа «фильтрами» (или переназначена с помощью @JsonProperty (значение = «фильтры») Я думаю, что я немного запутался в рекурсивном характере этого JSON. – johnktims

+0

У вас есть геттер и сеттер для каждого частного поля? –

ответ

2

Неверный тип фильтра. Он должен расширять фильтры. После исправления вашего модульного теста (json неверно) он может загрузить ваш json в объект Filters.

public class Filter extends Filters { 
    private String field; 
    private String operator; 
    private String value; 
    // accessors/mutators/toString 
} 
+0

Спасибо! Я объединил фильтр и фильтры в один класс, а затем добавил @JsonInclude (Include.NON_NULL) в класс, чтобы удалить все поля, которые не применяются. – johnktims

+0

Я несколько раз пытался добавить свое окончательное решение, но я продолжаю получать сообщение об ошибке «Ваше сообщение, похоже, содержит код, который не был правильно отформатирован как код». даже если он правильно отформатирован в предварительном просмотре. – johnktims

Смежные вопросы