Pregunta

¿Existe una manera sencilla de devolver datos a clientes de servicios web en JSON usando Java?Estoy bien con servlets, spring, etc.

¿Fue útil?

Solución

A mi, el mejor analizador Java <-> JSON es XStream (sí, realmente estoy hablando de json, no de xml).XStream ya se ocupa de dependencias circulares y tiene una API simple y potente donde puedes escribir tus controladores, convertidores, etc.

Atentamente

Otros consejos

Puede que valga la pena investigar Jersey.Jersey facilita la exposición de servicios web tranquilos como xml y/o JSON.

Un ejemplo...empieza con una clase sencilla

@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; }
}

Luego crea un recurso

@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");
    }
}

y exponerlo.Hay muchas formas de hacer esto, como usar el ServletContainer de Jersey.(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>

Eso es todo lo que necesitas hacer...abre tu navegador y busca http://localhost/blah/1.De forma predeterminada, verá la salida XML.Si está utilizando FireFox, instale TamperData y cambie su accept encabezado a application/json para ver la salida JSON.

Obviamente hay mucho más, pero Jersey hace que todo eso sea bastante fácil.

¡Buena suerte!

Hemos estado usando Flexjson para convertir objetos Java a JSON y lo encontramos muy fácil de usar.http://flexjson.sourceforge.net

Aquí hay unos ejemplos:

public String searchCars() {
  List<Car> cars = carsService.getCars(manufacturerId);
  return new JSONSerializer().serialize(cars);
}

Tiene algunas características interesantes como deepSerialize para enviar el gráfico completo y no rompe las relaciones bidireccionales.

new JSONSerializer().deepSerialize(user); 

Formatear fechas en el lado del servidor también suele ser útil

new JSONSerializer().transform(
  new DateTransformer("dd/MM/yyyy"),"startDate","endDate"
).serialize(contract);

http://www.json.org/java/index.html tiene lo que necesitas.

¡Sí!Verificar json-lib

Aquí hay un fragmento de código simplificado de mi propio código que envían un conjunto de objetos de mi dominio:

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 me ha parecido convincente.Se convierte a JSON y viceversa. http://code.google.com/p/google-gson/ Es muy flexible y puede manejar complejidades con objetos de una manera sencilla.Me encanta su soporte para genéricos.

/*
* 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);

Para servicios web RESTful en Java, consulte también el API de restlet que proporciona una abstracción muy poderosa y flexible para servicios web REST (tanto servidor como cliente, en un contenedor o independiente), y también se integra muy bien con Spring y JSON.

Como ya fue mencionado, Jersey (JAX-RS impl) es el marco a utilizar;pero para el mapeo básico de objetos Java hacia/desde JSON, Tutorial es bueno.A diferencia de muchas alternativas, no utiliza convenciones extrañas de compatibilidad XML, sino que lee y escribe JSON limpio que se asigna directamente hacia y desde objetos.Tampoco tiene problemas con nulos (hay diferencia entre una entrada que falta y una que tiene un nulo), listas vacías o cadenas (ambas son distintas de los nulos).

Jackson también funciona muy bien con Jersey, ya sea usando el jar del proveedor JAX-RS o incluso manualmente.De manera similar, es trivialmente fácil de usar con servlets antiguos y simples;simplemente obtenga el flujo de entrada/salida, llame a ObjectMapper.readValue() y .writeValue(), y eso es todo.

He estado usando jaxws-json para proporcionar servicios web en formato JSON.puedes consultar el proyecto https://jax-ws-commons.dev.java.net/json/.

Es un bonito proyecto, una vez que lo tengas en marcha, descubrirás lo encantador que es.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top