Как предоставить данные в формате JSON через веб-сервис с использованием Java? - PullRequest
22 голосов
/ 12 сентября 2008

Есть ли простой способ вернуть данные клиентам веб-службы в JSON с использованием Java? Я в порядке с сервлетами, весной и т. Д.

Ответы [ 9 ]

18 голосов
/ 16 сентября 2008

Возможно, стоит заглянуть в Джерси . Джерси позволяет легко выставлять успокоительные веб-сервисы в формате 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://localhost/blah/1. По умолчанию вы увидите вывод XML. Если вы используете FireFox, установите TamperData и измените заголовок accept на application/json, чтобы увидеть вывод JSON.

Очевидно, что это гораздо больше, но Джерси делает все эти вещи довольно легкими.

Удачи!

7 голосов
/ 12 сентября 2008

Мы использовали 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);
5 голосов
/ 12 сентября 2008

Для меня лучший анализатор JSON для Java <-> - это XStream (да, я действительно говорю о json, а не о xml). XStream уже имеет дело с циклическими зависимостями и имеет простой и мощный API, где вы можете написать свои драйверы, конвертеры и т. Д.

С уважением

3 голосов
/ 02 марта 2010

Я нашел 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);
3 голосов
/ 12 сентября 2008

Да! Проверьте 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;
}
3 голосов
/ 12 сентября 2008

http://www.json.org/java/index.html есть то, что вам нужно.

1 голос
/ 21 сентября 2010

Я использовал jaxws-json для предоставления веб-сервисов в формате JSON. Вы можете проверить проект https://jax -ws-commons.dev.java.net / json / .

Это хороший проект, как только вы его запустите, вы узнаете, насколько он очарователен.

1 голос
/ 24 апреля 2009

Как уже упоминалось, Джерси (JAX-RS impl) является основой для использования; но для базового отображения объектов Java в / из JSON хорошо подходит Tutorial . В отличие от многих альтернатив, он не использует странные соглашения о совместимости XML, но читает и записывает чистый JSON, который напрямую сопоставляется с объектами и из них. У него также нет проблем с нулем (есть разница между отсутствующей записью и пустой строкой), пустыми списками или строками (оба отличны от нуля).

Джексон прекрасно работает и с Джерси, используя JAX-RS-провайдер или даже вручную. Точно так же это легко использовать с простыми старыми сервлетами; просто получите поток ввода / вывода, вызовите ObjectMapper.readValue () и .writeValue (), и это все.

1 голос
/ 15 сентября 2008

Для веб-сервисов RESTful в Java также ознакомьтесь с Restlet API , который обеспечивает очень мощную и гибкую абстракцию для веб-сервисов REST (как сервера, так и клиента, в контейнере или автономно), а также интегрирует прекрасно с Spring и JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...