【问题标题】:Display JSON on browser using Jersey使用 Jersey 在浏览器上显示 JSON
【发布时间】:2013-03-01 06:32:09
【问题描述】:

我正在使用 Jersey 来实现 REST 服务。我想在浏览器上显示 JSON,但我得到的是 XML。

@Path("/todos")
public class TodosResource {

// Allows to insert contextual objects into the class, 
// e.g. ServletContext, Request, Response, UriInfo
@Context
UriInfo uriInfo;
@Context
Request request;


// Return the list of todos to the user in the browser
@GET
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
  public List<Todo> getTodosBrowser() {
  List<Todo> todos = new ArrayList<Todo>();
  todos.addAll(TodoDao.instance.getModel().values());
  return todos; 
}

感谢您的帮助。

【问题讨论】:

  • 问题到底是什么?你说你想要 JSON,你得到了 JSON。
  • 我想要一个 JSON 表示,而我得到的是 XML。
  • 假设您想使用 JSON 响应,而不仅仅是呈现对象?如果是这样,请参阅how-to-use-json-file-in-html-code
  • @user2165029:如果只显示 JSON,您不只需要 @Produces("application/json") 吗?
  • 您的请求中是否设置了Accept: application/json 标头?

标签: java json browser jersey


【解决方案1】:

好吧,您的代码声明它生成 XML 和 JSON。根据您的浏览器设置,它可能会请求 XML 而不是 JSON。

首先,检查您的代码是否真的可以生成 JSON。从 @Produces 注释中删除 MediaType.APPLICATION_XML 并再次测试。

如果可行,您需要告诉浏览器请求 JSON。将Accept: application/json 添加到您的请求标头中。

如何完成取决于您的客户端应用程序。在 JavaScript 中,这是通过添加类似

的内容来完成的
httpRequest.setRequestHeader('Accept', 'application/json'); 

取决于您使用的框架。也可以在命令行使用curl进行测试

curl -H "Accept: application/json" http://yourhost/context/todos

如果您在浏览器中键入 URL,它很可能会发送以下接受标头

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

因为浏览器想要向用户显示某些内容(样式化的 html)。这就是 MediaType.APPLICATION_XML 优先于您的 MediaType.APPLICATION_JSON 的原因。

【讨论】:

  • +1 是的,我认为没有任何浏览器会通过请求发送Accept: application/json。我假设 OP 是直接在浏览器中输入 URL,而不是使用 REST 工具或 cURL。大多数浏览器都有一个 JSON 插件,可以添加标题或提供添加标题的方法,例如 Chrome 的 Advanced REST Client
【解决方案2】:

添加jersey-json.jar

将 POJOMappingFeature 作为 initparam 添加到 web.xml 中,然后它会自动将 java 列表转换为 json 格式。

<init-param>
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>true</param-value>
</init-param>

【讨论】:

    【解决方案3】:

    1) 安装浏览器扩展程序,例如邮递员 (Chrome) 或海报 (FireFox) 2) 在这个扩展中添加 header Accept:application/json

    【讨论】:

      【解决方案4】:

      我可以看到你的方法是用 GET 映射的。所以你必须改变@Produces({ MediaType.APPLICATION_JSON })。这将仅生成 JSON 格式的数据,并且要在浏览器中查看这些数据,您可以为 Chrome 浏览器插入 Advance Rest API(应用程序)支持。那肯定会奏效。万事如意

       @GET
       @Produces({MediaType.APPLICATION_JSON})
       public List<Todo> getTodosBrowser() {
         List<Todo> todos = new ArrayList<Todo>();
         todos.addAll(TodoDao.instance.getModel().values());
         return todos; 
       }
      
       Web.xml-
       <?xml version="1.0" encoding="UTF-8"?>
       <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"             xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee       http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
         <display-name>homepage_todaysdeal_products</display-name>
            <welcome-file-list>
              <welcome-file>default.jsp</welcome-file>
             </welcome-file-list>
           <servlet>
             <servlet-name>RESTService</servlet-name>
             <servlet-  class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
           <init-param>
             <param-name>com.sun.jersey.config.property.packages</param-name>
             <param-value>"Mention Your Package Name here for GET/POST"</param-value>
           </init-param>
           <init-param>
             <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
             <param-value>true</param-value>
           </init-param>
           <load-on-startup>1</load-on-startup>
           </servlet>
           <servlet-mapping>
           <servlet-name>RESTService</servlet-name>
           <url-pattern>/rest/*</url-pattern>
           </servlet-mapping>
         </web-app>
      

      【讨论】:

        猜你喜欢
        • 2019-04-04
        • 1970-01-01
        • 2017-06-01
        • 2014-08-15
        • 1970-01-01
        • 2018-09-19
        • 1970-01-01
        • 2021-03-04
        • 2013-12-19
        相关资源
        最近更新 更多