Разбор сложного типа JSON в Джерси

1

Я использую Джерси, чтобы создать сервлет, который занимает немного сложную структуру 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 проверяет.

  • 0
    Не получается как ?
  • 1
    Вы пытались удалить запятые после ], ,? Я бы использовал проверку Json через: jsoneditoronline.org
Показать ещё 2 комментария
Теги:
jersey
soa

2 ответа

0

Рассмотрите возможность использования 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.

0

Ошибка, возникающая из-за того, что ваш JSON файл недействителен. комы после квадратных скобок не должно быть там.

Error: Parse error on line 13:
...      }
    ],
 },
{
    "name":
 --------------------^
Expecting 'STRING', got '}'

Ещё вопросы

Сообщество Overcoder
Наверх
Меню