【问题标题】:How correctly produce JSON by RESTful web service?RESTful Web 服务如何正确生成 JSON?
【发布时间】:2012-11-15 16:57:07
【问题描述】:

我是第一次编写 Web 服务。我创建了一个基于 Jersey 的 RESTful Web 服务。我想生成 JSON。我需要做什么来生成正确的 JSON 类型的 Web 服务?

这是我的一种方法:

@GET
@Path("/friends")
@Produces("application/json")
public String getFriends() {
    return "{'friends': ['Michael', 'Tom', 'Daniel', 'John', 'Nick']}";
}

我只需为我的方法指出注释@Produces("application/json") 就足够了吗?那么这个方法可能返回任何类型的对象呢?还是只有字符串?我需要对这些对象进行额外处理或转换吗?

请帮助我作为初学者处理这些问题。提前致谢!

【问题讨论】:

    标签: java json web-services rest jersey


    【解决方案1】:

    您可以使用 jaxb 注释来注释您的 bean。

      @XmlRootElement
      public class MyJaxbBean {
        public String name;
        public int age;
    
        public MyJaxbBean() {} // JAXB needs this
    
        public MyJaxbBean(String name, int age) {
          this.name = name;
          this.age = age;
        }
      }
    

    然后您的方法将如下所示:

       @GET @Produces("application/json")
       public MyJaxbBean getMyBean() {
          return new MyJaxbBean("Agamemnon", 32);
       }
    

    在最新的文档中有一个章节处理这个问题:

    https://jersey.java.net/documentation/latest/user-guide.html#json

    【讨论】:

    • 感谢您指出无参数构造函数部分。这很重要!
    【解决方案2】:

    您可以使用像 org.json http://www.json.org/java/ 这样的包

    因为您将需要更频繁地使用 JSONObjects。

    在那里您可以轻松地创建 JSONObjects 并在其中放入一些值:

     JSONObject json = new JSONObject();
     JSONArray array=new JSONArray();
        array.put("1");
        array.put("2");
        json.put("friends", array);
    
        System.out.println(json.toString(2));
    
    
        {"friends": [
          "1",
          "2"
        ]}
    

    编辑这样做的好处是您可以在不同的层中构建响应并将它们作为对象返回

    【讨论】:

      【解决方案3】:
      @GET
      @Path("/friends")
      @Produces(MediaType.APPLICATION_JSON)
      public String getFriends() {
      
          // here you can return any bean also it will automatically convert into json 
          return "{'friends': ['Michael', 'Tom', 'Daniel', 'John', 'Nick']}";
      }
      

      【讨论】:

      • @Produces("application/json")@Produces(MediaType.APPLICATION_JSON) 有何不同?
      • 完全一样。 MediaType.APPLICATION_JSON 是一个常量,其值等于application/json。使用常量不易出错,因此是更好的选择
      【解决方案4】:
      @POST
      @Path ("Employee")
      @Consumes("application/json")
      @Produces("application/json")
      public JSONObject postEmployee(JSONObject jsonObject)throws Exception{
          return jsonObject;
      }       
      

      【讨论】:

        【解决方案5】:

        使用此注释

        @RequestMapping(value = "/url", method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON})
        

        【讨论】:

        • 这不是Spring注解吗?我不认为这是有效的。
        • OP 很清楚:“我基于 Jersey 创建了一个 RESTful Web 服务。” @GetMapping 注释不是泽西岛 API。这是一个 Spring MVC 注释。
        猜你喜欢
        • 2016-03-24
        • 2016-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-11
        • 2018-06-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多