RESTful Web 服务如何正确生成 JSON?

Posted

技术标签:

【中文标题】RESTful Web 服务如何正确生成 JSON?【英文标题】:How correctly produce JSON by RESTful web service? 【发布时间】: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") 就足够了吗?那么这个方法可能返回任何类型的对象呢?还是只有字符串?我需要对这些对象进行额外处理或转换吗?

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

【问题讨论】:

【参考方案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 注释。

以上是关于RESTful Web 服务如何正确生成 JSON?的主要内容,如果未能解决你的问题,请参考以下文章

使用 WCF 创建需要身份验证并使用 JSON 作为输入/输出格式的 RESTful Web 服务

如何使用 Jersey API 从 RESTful Web 服务发送和接收 JSON 数据

为 RESTful Web 服务设置 MySQL 和 Apache

如何使用DRUPAL 8中的RESTful Web服务API创建field_collection_item

在 Android 的 RESTFUL Web 服务的 URL 中传递 JSON 对象?

spring-cloud 构建一个restful的web服务