2013-07-31 42 views
1

我有一個實體(列表),我需要轉換爲/從JSON的集合。澤西島2.1 - 消費作爲JSON字符串的POJO收集

的POJO:

public class Task { 

    private Long id; 

    private String title; 

    private Boolean done; 
    (...) 
} 

新澤西州將產生以下結果

[{"id":1,"title":"T1","done":false},{"id":2,"title":"T2","done":false}] 

當我打電話的方法:

@GET 
@Override 
@Produces("application/json") 
public List<Task> findAll() { 
    (...) 
    return tasks; 
} 

到目前爲止好。

現在,我需要使用一個類似的JSON字符串。我認爲下面的方法會做的伎倆:

@PUT 
@Consumes("application/json") 
public void save(List<Task> tasks) { 
    (...) 
} 

而是我得到的錯誤如下:

SEVERE: line 1:0 no viable alternative at input 
'"[{\"id\":1,\"title\":\"T1\",\"done\":true},{\"id\":2,\"title\":\"T2\",\"done\":false}]"' 

我在做什麼錯?這甚至有可能嗎?

新澤西州的依賴關係:

<dependency> 
    <groupId>javax.ws.rs</groupId> 
    <artifactId>javax.ws.rs-api</artifactId> 
    <version>2.0</version> 
    <scope>provided</scope> 
</dependency> 
<dependency> 
    <groupId>org.glassfish.jersey.containers</groupId> 
    <artifactId>jersey-container-servlet</artifactId> 
    <version>2.1</version> 
    <scope>provided</scope> 
</dependency> 
<dependency> 
    <groupId>org.glassfish.jersey.media</groupId> 
    <artifactId>jersey-media-moxy</artifactId> 
    <version>2.1</version> 
</dependency> 

下面是web.xml配置

<servlet> 
    <servlet-name>Jersey Servlet</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>jersey.config.server.provider.packages</param-name> 
     <param-value>my.rest.package</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>Jersey Servlet</servlet-name> 
    <url-pattern>/rest/*</url-pattern> 
</servlet-mapping> 
+0

你如何映射'Task'以JSON?你使用JAXB嗎? – 2013-08-01 07:09:19

+0

我按照[這裏](https://jersey.java.net/documentation/latest/user-guide.html#json.moxy)所述將moxy模塊添加到我的pom.xml中。 json序列化很好,問題在於反序列化。 –

回答

2

看來,你在你的郵件正文發送損壞的JSON作爲實體,是這樣的:

POST http://localhost:9998/test/list 
Accept: application/json 
Content-Type: application/json 
"[{\"a\":\"a\",\"b\":1,\"c\":1}]" 

我能得到的與此類實體相同的錯誤(line 1:0 no viable alternative at input '"[{\"a\":\"a\",\"b\":1,\"c\":1}]"')。

確保您發送有效的JSON到您的REST服務,即在應用程序中註冊一個日誌過濾器:

new ResourceConfig() 
    .packages("my.rest.package") 
    // Register logging filter and print entity. 
    .register(new LoggingFilter(LOGGER, true)); 
+1

你釘了那個!異常是由無效的JSON按摩造成的。我正在調用JSON.stringify()兩次。我的錯! –

0

或者,您可以接受傳入的JSON string和使用任何標準解析器的方法中解析它。

@PUT 
public void save(String s) { 
    // parse s 
} 
0

類型參數在type erasure之後不可用。

嘗試使用數組而不是列表:

@PUT 
@Consumes("application/json") 
public void save(Task[] taskArray) { 
    List<Task> tasks = Arrays.asList(taskArray); 
    (...) 
}