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

有帮助吗?

解决方案

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

亲切的问候

其他提示

可能值得研究一下 球衣. 。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。(网络.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 输出。

显然还有更多的事情要做,但是 球衣 让所有这些事情变得非常容易。

祝你好运!

我们一直在使用 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);

是的!查看 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;
}

我发现 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);

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top