2011-07-15 38 views
4

我有兩個類結合嵌套JSON使用傑克遜變換器

到@RequestBody對象
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

問題中更新的JSON示例仍然無效。我建議使用JSONLint.com檢查JSON示例。

以下是使用Jackson在當前版本的問題中將修正後的JSON版本反序列化爲相同的父/子類結構的示例。

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

由於某種原因,我想出了一個問題,我使用的其他客戶端使事情變得更糟。現在正在工作。這是輸入json的問題。不是應用程序本身。謝謝你們的幫助...... – user845730

1

人們會首先猜測兒童年齡段15歲和10歲以後的流浪語。什麼產生你的輸入?

+0

我更新了帖子。我通過報價。後來的兩種格式的Json都成功了。 – user845730

-1

該問題已通過添加以下邏輯修復。

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

這裏Java類DrugListJsonRequest應該擴展

HashMap<String,ArrayList<DrugListCriterion>> 

它不需要任何方法和構造函數。

public class DrugListJsonRequest extends HashMap<String,ArrayList<DrugListCriterion>>{}