Есть ли простой способ вернуть данные клиентам веб-служб в JSON с помощью java? Меня устраивают сервлеты, весна и т. д.
Смотрите также более современные ответы в Вывод JSON веб-службы JAX-WS




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;
}
из любопытства ... есть ли причина инициализировать результат как "упс"? это значение никогда не может быть возвращено из этого метода, не так ли?
Я только что сделал это для фрагмента - мой производственный код, из которого я получил это, на самом деле не генерирует исключение, а представляет собой json-документ String constance, который клиентское приложение может хорошо переваривать.
Мы использовали 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);
FlexJSON выглядит как лучший вариант сериализации Java-> JSON, который я когда-либо видел. Но у меня на другом конце есть Java ... какие-нибудь предложения по десериализации?
Для выполнения этой работы можно использовать flexjson JSONDeserializer. Я использую оба способа без проблем.
Для меня лучший парсер Java <-> JSON - XStream (да, я действительно говорю о json, а не о xml). XStream уже имеет дело с циклическими зависимостями и имеет простой и мощный API, где вы можете писать свои драйверы, конвертеры и так далее.
С уважением
Незначительная придирка: XStream НЕ является JSON парсер. Это сериализатор объектов, который может читать / писать JSON с помощью Jettison, который использует парсер json.org и украшает его с помощью Stax XML API.
Для веб-сервисов RESTful в Java также ознакомьтесь с Restlet API, который обеспечивает очень мощную и гибкую абстракцию для веб-сервисов REST (как серверных, так и клиентских, в контейнере или автономно), а также прекрасно интегрируется с Spring и JSON.
Возможно, стоит посмотреть Джерси. Джерси упрощает предоставление спокойных веб-сервисов в виде 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 Джерси. (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: // локальный / бла / 1. По умолчанию вы увидите вывод XML. Если вы используете FireFox, установите TamperData и измените заголовок accept на application/json, чтобы увидеть вывод JSON.
Очевидно, что это еще не все, но Джерси упрощает все это.
Удачи!
Абсолютно точно: Джерси - это то, что нужно использовать для веб-сервисов на основе JSON.
Как уже упоминалось, Джерси (JAX-RS impl) - это используемая структура; но для базового отображения объектов Java в / из JSON подходит Руководство. В отличие от многих альтернатив, он не использует странные соглашения о совместимости с XML, а читает и записывает чистый JSON, который напрямую сопоставляется с объектами и обратно. У него также нет проблем с нулевым значением (есть разница между отсутствующей записью и пустой), пустыми списками или строками (оба отличны от нулей).
Джексон также прекрасно работает с Джерси, либо используя jar-файл провайдера JAX-RS, либо даже просто вручную. Точно так же его тривиально легко использовать с простыми старыми сервлетами; просто получите поток ввода / вывода, вызовите 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. вы можете проверить проект https://jax-ws-commons.dev.java.net/json/.
это хороший проект, как только вы его запустите, вы поймете, насколько он очарователен.
можете ли вы подробнее рассказать об этом? особенно, если мы хотим преобразовать существующую службу jaxb (SOAP) в JSON, изменив только конечную точку?
это расширение существующего jaxws. Вместо публикации веб-службы с поддержкой SOAP она заставит веб-службу понимать JSON (просто добавив @BindingType (JSONBindingID.JSON_BINDING)).
Что касается клиентов, вместо связи через SOAP следует использовать JSON. Возможно, вам будет немного утомительно скомпилировать исходный код. Однако после того, как JAR правильно сгенерирован, его использование становится довольно простым. Они проделали там действительно большую работу. На самом деле это единственное «настоящее» решение привязки JSON, которое я нашел.
Поскольку это вопрос java + json, получивший большое количество голосов, было бы неплохо суммировать ответы; тем более, что это довольно старый вопрос, и стало доступно много новых вариантов (Spring MVC, Jersey / RESTeasy / CXF / Restlet; Gson / Jackson / FlexJSON)