Привязка вложенного json к объекту @RequestBody с помощью конвертера Джексона - PullRequest
4 голосов
/ 15 июля 2011

У меня есть два класса

public class Parent {
    private String name;
    private int age;
    private ArrayList<Child> children = new ArrayList<Child>();
    //Setters and getter to follow..
}

public Class Child {
    private String name;
    private int age;
}

Конфигурация Spring включает в себя:

<bean id="jsonMessageConverter"
    class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />

<bean
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <list>
            <ref bean="jsonMessageConverter" />
        </list>
    </property>
</bean>  

Контроллер выглядит следующим образом:

@RequestMapping(value = "/parents", 
                method = RequestMethod.POST, 
                headers="Content-Type=application/json")
public @ResponseBody Parent add(@RequestBody Parent parent, Model model) {

    logger.debug("Received request to add a parent");
    Parent tempParent = parentService.add(parent); // This will persist the parent object to the DB.. (Helper class)
    return tempContract;
}

В нормальных условиях он должен связать входящий json с Parent и вернуть Parent как Json в ответе. И это дает мне исключение: «Запрос, отправленный клиентом, был синтаксически неверным». со следующим вводом Json:

{
    "name" : "foo",
    "age" : "45",
    "children" : [ 
      {
         "name" : "bar",
         "age" : "15""
      },
      {
         "name" : "baz",
         "age" : "10""        
      }
    ]
} 

Попытался изменить json, и он работает просто отлично, связывая @RequestBody и @ResponseBody со следующими форматами:

{
    "name" : "foo",
    "age" : "45",
    "children" : []
}

и

{
    "name" : "foo",
    "age" : "45",
    "children" : [ 
      {}
    ]
} 

Таким образом, я предполагаю, что что-то не так в том, что касается фактического дочернего класса или способа передачи объекта Json по отношению к дочернему объекту. Может кто-нибудь, пожалуйста, помогите мне здесь. Также предлагается использовать

 private ArrayList<HashMap<String, Child>> children = new ArrayList<HashMap<String, Child>>();

вместо

private ArrayList<Child> children = new ArrayList<Child>();

Спасибо.

Ответы [ 3 ]

3 голосов
/ 15 июля 2011

Обновленный пример JSON в вопросе по-прежнему недействителен.Я рекомендую проверять примеры JSON с JSONLint.com.

Ниже приведен пример использования Джексона для десериализации исправленной версии JSON в той же структуре класса Parent / Child в текущей версии вопроса.

import java.util.ArrayList;

import org.codehaus.jackson.map.ObjectMapper;

public class Foo
{
  public static void main(String[] args) throws Exception
  {
/*
{
    "name": "foo",
    "age": "45",
    "children": [
        {
            "name": "bar",
            "age": "15"
        },
        {
            "name": "baz",
            "age": "10"
        }
    ]
}
 */
    String jsonInput = "{\"name\":\"foo\",\"age\":\"45\",\"children\":[{\"name\":\"bar\",\"age\":\"15\"},{\"name\":\"baz\",\"age\":\"10\"}]}";

    ObjectMapper mapper = new ObjectMapper();
    Parent parent = mapper.readValue(jsonInput, Parent.class);
    System.out.println(mapper.writeValueAsString(parent));
    // output:
    // {"name":"foo","age":45,"children":[{"name":"bar","age":15},{"name":"baz","age":10}]}
  }
}

class Parent
{
  public String name;
  public int age;
  public ArrayList<Child> children = new ArrayList<Child>();
}

class Child
{
  public String name;
  public int age;
}

Возможно ли, что сообщение об ошибке синтаксиса - это сообщение об ошибке синтаксиса?В частности, о неправильном вводе JSON?Или настоящий JSON действительно действителен, и только примеры в вопросе недействительны?

"предлагается использовать ArrayList<HashMap<String, Child>>"

Нет.Структура JSON не соответствует ArrayList<HashMap<String, Child>>.Так что я бы не стал его использовать.

1 голос
/ 15 июля 2011

Можно было бы сначала угадать случайные цитаты после 15 и 10 лет в возрасте детей.Что генерирует ваш вклад?

0 голосов
/ 12 октября 2012

Проблема была исправлена ​​добавлением логики ниже.

public @ResponseBody String  saveDrug(@RequestBody DrugListJsonRequest drugListCriterion) {}

Здесь ваш класс Java DrugListJsonRequest должен расширяться

HashMap<String,ArrayList<DrugListCriterion>>

Не требует никаких методов и конструкторов.

public class DrugListJsonRequest extends HashMap<String,ArrayList<DrugListCriterion>>{}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...