Есть ли простой способ вернуть данные клиентам веб-службы в JSON с помощью java? Я в порядке с сервлетами, spring и т.д.
Как предоставить данные в формате JSON через веб-службу с использованием Java?
Ответ 1
Для меня лучший парсер Java ↔ JSON - это XStream (да, я действительно говорю о json, а не о xml). XStream уже имеет дело с круговыми зависимостями и имеет простой и мощный api, где вы можете писать свои драйверы, конвертеры и т.д.
С уважением
Ответ 2
Возможно, стоит посмотреть Jersey. Джерси позволяет легко разоблачить спокойные веб-сервисы как 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 делает все это довольно просто.
Удачи!
Ответ 3
Мы использовали 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);
Ответ 4
http://www.json.org/java/index.html имеет то, что вам нужно.
Ответ 5
Да! Проверьте 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;
}
Ответ 6
Я нашел 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);
Ответ 7
Для веб-сервисов RESTful на Java также проверьте API-интерфейс Restlet, который обеспечивает очень мощную и гибкую абстракцию для веб-служб REST (как сервер и клиент, в контейнере или автономно), а также прекрасно сочетается с Spring и JSON.
Ответ 8
Как уже упоминалось, Jersey (JAX-RS impl) является основой для использования; но для базового отображения объектов Java в/из JSON, Tutorial является хорошим. В отличие от многих альтернатив, он не использует странные соглашения совместимости с XML, но считывает и записывает чистый JSON, который непосредственно сопоставляется с объектами и из них. У него также нет проблем с нулем (разница между отсутствующей записью и нулевой), пустые списки или строки (оба они отличны от нулей).
Джексон прекрасно работает с Джерси, используя либо JAX-RS, либо даже вручную. Точно так же он тривиально прост в использовании с обычными старыми сервлетами; просто получите поток ввода/вывода, вызовите ObjectMapper.readValue() и .writeValue(), и об этом.
Ответ 9
Я использую jaxws-json для предоставления веб-сервисов формата JSON. вы можете проверить проект https://jax-ws-commons.dev.java.net/json/.
Это хороший проект, как только вы его получите, вы узнаете, насколько он очарователен.