java - 在 Jersey 中解析复杂的 JSON 类型

标签 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 进行验证。

最佳答案

您遇到的错误是因为您的 JSON 文件无效。方括号后面的逗号不应该出现在此处。

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

关于java - 在 Jersey 中解析复杂的 JSON 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24025793/

相关文章:

Java:获取主应用程序的资源路径而不是jar的资源路径

java - Spring Security - Ajax 调用忽略@ExceptionHandler

java - 有没有办法使用 TestNG 数据提供程序为测试用例指定特定名称?

java - 带有嵌入式 jetty 和 Jersey 的服务器端自定义 header

java - 如何处理 REST Web 服务中的资源验证?

java - IKVM.NET 对象序列化与 ObjectOutputStream 的区别

json - 如何使用 SuperObject 序列化包含点(例如 IP 地址)的 JSON key ?

python - 在不知道索引是否存在的情况下处理访问 json 值的 pythonic 方法是什么?

php - 如何在 PHP 中将 HTML 字符串存储在 JSON 中?

eclipse - 资源不可用问题