我正在使用Jersey来创建一个带有稍微复杂的JSON结构的servlet:
[
{
"name": "bob",
"events": [
{
"type": "a",
"value": "b"
},
{
"type": "x",
"value": "y"
}
]
},
{
"name": "alice",
"events": [
{
"type": "one",
"value": "two"
},
{
"type": "three",
"value": "four"
}
]
}
]
我有以下数据类:
public class Read
{
private String name;
private ArrayList<Event> events;
// Getters & Setters
}
public class Event
{
private String type;
private String value;
// Getters & Setters
}
我希望能够接收JSON并将其放入ArrayList<Read>
对象中。我有以下代码:
@Path("/postreads")
@Consumes(MediaType.APPLICATION_JSON)
public class PostReads
{
@POST
@Path("/batch")
public Response postReads(ArrayList<Read> reads)
{
for (Read read : reads)
{
System.out.println(read.toString());
}
return Response.status(200).entity("Success.").build();
}
}
当我让它做一个简单的对象(Event
,只有两个String
属性)时,它运行正常。但是增加ArrayList
的复杂性会使它死亡。有没有办法自动解析JSON,还是我需要手动完成?这是一个非常开放的项目,所以如果我需要添加一个额外的库,我可以。
我在eclipse控制台上遇到的错误:
Jun 03, 2014 2:44:01 PM com.sun.jersey.spi.container.ContainerRequest getEntity
SEVERE: A message body reader for Java class java.util.ArrayList, and Java type java.util.ArrayList<com.project.postevents.Event>, and MIME media type application/json was not found.
The registered message body readers compatible with the MIME media type are:
application/json ->
com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$App
com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$App
com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$App
*/* ->
com.sun.jersey.core.impl.provider.entity.FormProvider
com.sun.jersey.core.impl.provider.entity.StringProvider
com.sun.jersey.core.impl.provider.entity.ByteArrayProvider
com.sun.jersey.core.impl.provider.entity.FileProvider
com.sun.jersey.core.impl.provider.entity.InputStreamProvider
com.sun.jersey.core.impl.provider.entity.DataSourceProvider
com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General
com.sun.jersey.core.impl.provider.entity.ReaderProvider
com.sun.jersey.core.impl.provider.entity.DocumentProvider
com.sun.jersey.core.impl.provider.entity.SourceProvider$StreamSourceReader
com.sun.jersey.core.impl.provider.entity.SourceProvider$SAXSourceReader
com.sun.jersey.core.impl.provider.entity.SourceProvider$DOMSourceReader
com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$General
com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General
com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General
com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$General
com.sun.jersey.core.impl.provider.entity.EntityHolderReader
com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$General
com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$General
编辑:方括号后的逗号是拼写错误。传入的JSON验证。
答案 0 :(得分:0)
考虑使用google-gson:
Gson是一个Java库,可用于将Java对象转换为JSON表示。它还可用于将JSON字符串转换为等效的Java对象。 Gson可以处理任意Java对象,包括你没有源代码的预先存在的对象。
您的用例示例代码(通过user guide):
class BagOfPrimitives {
private int value1 = 1;
private String value2 = "abc";
private transient int value3 = 3;
BagOfPrimitives() {
// no-args constructor
}
}
// Deserialization
Gson gson = new Gson();
String json = ...;
BagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class);
在该页面上还有更复杂的例子,包括数组,集合等。
免责声明:我在谷歌工作,但与google-gson无关。
答案 1 :(得分:0)
您遇到的错误是因为您的JSON文件无效。方括号后的昏迷不应该在那里。
Error: Parse error on line 13:
... }
],
},
{
"name":
--------------------^
Expecting 'STRING', got '}'