在Jersey中解析复杂的JSON类型

时间:2014-06-03 22:07:16

标签: java json jersey soa

我正在使用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验证。

2 个答案:

答案 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 '}'