如何使用 Java 通过 Web 服务以 JSON 格式公开数据?

2022-09-02 00:55:11

有没有一种简单的方法可以使用java在JSON中将数据返回到Web服务客户端?我对servlets,spring等都很好。


答案 1

可能值得一看泽西岛。泽西岛使将宁静的Web服务公开为xml和/或JSON变得容易。

举个例子...从一个简单的类开始

@XmlType(name = "", propOrder = { "id", "text" })
@XmlRootElement(name = "blah")
public class Blah implements Serializable {
    private Integer id;
    private String text;

    public Blah(Integer id, String text) {
        this.id = id;
        this.text = text;
    }    

    @XmlElement
    public Integer getId() { return id; }
    public void setId(Integer id) { this.id = id; }

    @XmlElement
    public String getText() { return text; }
    public void setText(String value) { this.text = value; }
}

然后创建资源

@Path("/blah")
public class BlahResource {
    private Set<Blah> blahs = new HashSet<Blah>();

    @Context
    private UriInfo context;

    public BlahResource() {
        blahs.add(new Blah(1, "blah the first"));
        blahs.add(new Blah(2, "blah the second"));
    }

    @GET
    @Path("/{id}")
    @ProduceMime({"application/json", "application/xml"})
    public Blah getBlah(@PathParam("id") Integer id) {
        for (Blah blah : blahs) {
            if (blah.getId().equals(id)) {
                return blah;
            }
        }
        throw new NotFoundException("not found");
    }
}

并暴露它。有很多方法可以做到这一点,例如使用泽西岛的ServletContainer。(网站.xml)

<servlet>
    <servlet-name>jersey</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>jersey</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

这就是您需要做的所有事情...弹出打开浏览器并浏览到 http://localhost/blah/1。默认情况下,您将看到 XML 输出。如果您使用的是 FireFox,请安装 TamperData 并将标头更改为 以查看 JSON 输出。acceptapplication/json

显然,还有更多的东西,但是泽西岛使所有这些东西都变得非常容易。

祝你好运!


答案 2

我们一直在使用Flexjson将Java对象转换为JSON,并且发现它非常易于使用。http://flexjson.sourceforge.net

以下是一些示例:

public String searchCars() {
  List<Car> cars = carsService.getCars(manufacturerId);
  return new JSONSerializer().serialize(cars);
}

它具有一些很酷的功能,例如deepSerialize以发送整个图形,并且它不会与双向关系中断。

new JSONSerializer().deepSerialize(user); 

在服务器端格式化日期通常也很方便

new JSONSerializer().transform(
  new DateTransformer("dd/MM/yyyy"),"startDate","endDate"
).serialize(contract);