如何使用Java通过Web服务公开JSON格式的数据?
有没有一种简单的方法可以使用Java将数据返回JSON中的Web服务客户端?我对servlet,spring等都很好。
解决方案
回答
http://www.json.org/java/index.html具有我们所需要的。
回答
是的!查看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; }
回答
我们一直在使用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);
回答
对我来说,最好的Java <-> JSON解析器是XStream(是的,我实际上是在谈论json,而不是xml)。 XStream已经处理循环依赖关系,并具有一个简单而强大的api,我们可以在其中编写驱动程序,转换器等。
亲切的问候
回答
对于Java中的RESTful Web服务,还请查看Restlet API,它为REST Web服务(服务器和客户端,在容器中或者独立)提供了非常强大和灵活的抽象,并且与Spring和JSON很好地集成。
回答
也许值得去看泽西岛。 Jersey使将宁静的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输出。
显然还有很多,但是泽西岛使所有这些事情变得非常容易。
祝你好运!
回答
如前所述,Jersey(JAX-RS impl)是要使用的框架。但是对于将Java对象与JSON进行基本映射/从JSON映射而言,Tutorial很好。与许多替代方法不同,它不使用奇怪的XML兼容约定,而是读取和写入直接映射到对象或者从对象映射的干净JSON。空值(缺少条目和具有空值的条目之间也有区别),空列表或者字符串(两者都与空值不同)也没有问题。
Hyman逊也可以使用JEX-RS提供程序jar,甚至可以手动使用,也与Jersey配合得很好。
同样,使用普通的旧servlet非常容易。只要获取输入/输出流,就调用ObjectMapper.readValue()和.writeValue()即可。
回答
我发现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);
回答
我一直在使用jaxws-json来提供JSON格式的Web服务。我们可以检查项目https://jax-ws-commons.dev.java.net/json/。
这是一个不错的项目,一旦我们掌握了它,就会发现它有多迷人。