22

有没有一种简单的方法可以使用 java 以 JSON 格式将数据返回给 Web 服务客户端?我对 servlet、spring 等很好。

4

9 回答 9

18

可能值得研究一下泽西岛。Jersey 可以轻松地将 restful 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");
    }
}

并暴露它。有很多方法可以做到这一点,例如使用 Jersey 的 ServletContainer。(web.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 并将您的accept标头更改application/json为查看 JSON 输出。

显然还有更多,但泽西岛让所有这些事情变得非常容易。

祝你好运!

于 2008-09-16T16:02:41.360 回答
7

我们一直在使用 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);
于 2008-09-12T00:52:14.780 回答
5

对我来说,最好的 Java <-> JSON 解析器是 XStream(是的,我说的是 json,而不是 xml)。XStream 已经处理了循环依赖,并且有一个简单而强大的 api,您可以在其中编写自己的驱动程序、转换器等。

亲切的问候

于 2008-09-12T01:40:11.513 回答
3

http://www.json.org/java/index.html有你需要的。

于 2008-09-11T21:41:40.510 回答
3

是的!查看json-lib

这是我自己的代码的简化代码片段,它发送一组我的域对象:

private String getJsonDocumenent(Object myObj) (
    String result = "oops";
    try {
        JSONArray jsonArray = JSONArray.fromObject(myObj);

        result = jsonArray.toString(2);  //indent = 2

    } catch (net.sf.json.JSONException je) {

        throw je;
    }
    return result;
}
于 2008-09-11T21:44:49.007 回答
3

我发现 google-gson 引人注目。它转换为 JSON 并返回。http://code.google.com/p/google-gson/它非常灵活,可以直接处理对象的复杂性。我喜欢它对泛型的支持。

/*
* we're looking for results in the form
* {"id":123,"name":thename},{"id":456,"name":theOtherName},...
*
* TypeToken is Gson--allows us to tell Gson the data we're dealing with
* for easier serialization.
*/
Type mapType = new TypeToken<List<Map<String, String>>>(){}.getType();

List<Map<String, String>> resultList = new LinkedList<Map<String, String>>();

for (Map.Entry<String, String> pair : sortedMap.entrySet()) {
    Map<String, String> idNameMap = new HashMap<String, String>();
    idNameMap.put("id", pair.getKey());
    idNameMap.put("name", pair.getValue());
    resultList.add(idNameMap);
}

return (new Gson()).toJson(resultList, mapType);
于 2010-03-02T17:31:57.953 回答
1

对于 Java 中的 RESTful Web 服务,还可以查看Restlet API,它为 REST Web 服务(服务器和客户端,在容器中或独立)提供了非常强大和灵活的抽象,并且还与 Spring 和 JSON 很好地集成。

于 2008-09-15T13:23:22.983 回答
1

如前所述,Jersey (JAX-RS impl) 是要使用的框架;但是对于 Java 对象与 JSON 的基本映射,Tutorial很好。与许多替代方案不同,它不使用奇怪的 XML 兼容性约定,而是读取和写入直接映射到对象和从对象映射的干净 JSON。它也没有关于 null(缺少条目和具有 null 的条目之间存在差异)、空列表或字符串(两者都与 null 不同)的问题。

Jackson 也可以很好地与 Jersey 配合使用,可以使用 JAX-RS 提供程序 jar,甚至可以手动使用。同样,它也很容易与普通的旧 servlet 一起使用;只需获取输入/输出流,调用 ObjectMapper.readValue() 和 .writeValue(),仅此而已。

于 2009-04-24T18:25:19.937 回答
1

我一直在使用 jaxws-json,用于提供 JSON 格式的 Web 服务。您可以检查项目https://jax-ws-commons.dev.java.net/json/

这是一个不错的项目,一旦你上手,你就会发现它有多迷人。

于 2010-09-21T03:14:41.333 回答