Я использую Джерси, чтобы создать сервлет, который занимает немного сложную структуру JSON:
[
{
"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 проверяет.
Рассмотрите возможность использования google-gson:
Gson - это библиотека Java, которую можно использовать для преобразования объектов Java в их представление JSON. Его также можно использовать для преобразования строки JSON в эквивалентный объект Java. Gson может работать с произвольными объектами Java, включая уже существующие объекты, исходный код которых у вас отсутствует.
Пример кода для вашего варианта использования (через руководство пользователя):
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, но не связан с Google-GSON.
Ошибка, возникающая из-за того, что ваш JSON файл недействителен. комы после квадратных скобок не должно быть там.
Error: Parse error on line 13:
... }
],
},
{
"name":
--------------------^
Expecting 'STRING', got '}'
],
,? Я бы использовал проверку Json через: jsoneditoronline.org