ejemplo - ¿Cómo expongo los datos en formato JSON a través de un servicio web usando Java?
web service java json (9)
¡Sip! Echa un vistazo a json-lib
Aquí hay un fragmento de código simplificado de mi propio código que envía un conjunto de mis objetos de 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;
}
¿Hay alguna manera fácil de devolver datos a clientes de servicios web en JSON usando Java? Estoy bien con los servlets, la primavera, etc.
Como ya se mencionó, Jersey (JAX-RS impl) es el marco para usar; 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, pero lee y escribe JSON limpio que se correlaciona directamente con los objetos. Tampoco tiene problemas con null (hay diferencia entre la entrada faltante y la que tiene nulo), las listas vacías o las cadenas (ambas son distintas de las nulas).
Jackson también trabaja muy bien con Jersey, ya sea usando el proveedor de jar JAX-RS, o incluso solo de forma manual. Del mismo modo, es trivialmente fácil de usar con viejos servlets; solo obtenga flujo de entrada / salida, llame a ObjectMapper.readValue () y .writeValue (), y eso es todo.
He encontrado google-gson convincente. Convierte a JSON y viceversa. http://code.google.com/p/google-gson/ Es muy flexible y puede manejar las complejidades de los objetos de una manera directa. Me encanta su apoyo a los 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);
He estado usando jaxws-json, para proporcionar servicios web de formato JSON. puedes consultar el proyecto https://jax-ws-commons.dev.java.net/json/ .
es un buen proyecto, una vez que lo levante, descubrirá lo encantador que es.
Hemos estado utilizando Flexjson para convertir objetos Java a JSON y hemos encontrado que es 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 geniales como deepSerialize para enviar todo el gráfico y no se rompe con las relaciones bidireccionales.
new JSONSerializer().deepSerialize(user);
El formateo de fechas en el lado del servidor a menudo también es útil
new JSONSerializer().transform(
new DateTransformer("dd/MM/yyyy"),"startDate","endDate"
).serialize(contract);
Para los servicios web RESTful en Java, también consulte la API de Restlet, que proporciona una abstracción muy potente y flexible para los servicios web REST (servidor y cliente, en un contenedor o independiente), y también se integra muy bien con Spring y JSON.
Para mí, el mejor analizador Java <-> JSON es XStream (sí, realmente estoy hablando de json, no de xml). XStream ya se ocupa de las dependencias circulares y tiene una aplicación api sencilla y poderosa en la que puede escribir sus controladores, convertidores, etc.
Saludos cordiales
Podría valer la pena investigar en Jersey . Jersey hace que sea fácil exponer servicios web relajantes como xml y / o JSON.
Un ejemplo ... comienza con una clase simple
@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 hacerlo, como usar 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 necesita hacer ... abra su navegador y vaya a http: // localhost / blah / 1 . Por defecto verá salida XML. Si está utilizando FireFox, instale TamperData y cambie su encabezado de accept
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!
http://www.json.org/java/index.html tiene lo que necesita.