Question

Existe-t-il un moyen simple de renvoyer des données aux clients de services Web en JSON à l'aide de Java ?Je suis d'accord avec les servlets, le printemps, etc.

Était-ce utile?

La solution

Tome, le meilleur analyseur Java <-> JSON est XStream (oui, je parle vraiment de json, pas de xml).XStream gère déjà les dépendances circulaires et dispose d'une API simple et puissante dans laquelle vous pouvez écrire vos pilotes, convertisseurs, etc.

Cordialement

Autres conseils

Cela vaut peut-être la peine d'y réfléchir Jersey.Jersey facilite l'exposition de services Web reposants au format XML et/ou JSON.

Un exemple...commencer par un cours 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; }
}

Créez ensuite une ressource

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

et exposez-le.Il existe de nombreuses façons de procéder, par exemple en utilisant 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>

C'est tout ce que vous devez faire...ouvrez votre navigateur et accédez à http://localhost/blah/1.Par défaut, vous verrez une sortie XML.Si vous utilisez FireFox, installez TamperData et modifiez votre accept en-tête vers application/json pour voir la sortie JSON.

Il y a évidemment bien plus à faire, mais Jersey rend tout cela assez facile.

Bonne chance!

Nous utilisons Flexjson pour convertir des objets Java en JSON et nous l'avons trouvé très facile à utiliser.http://flexjson.sourceforge.net

Voici quelques exemples:

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

Il possède des fonctionnalités intéressantes telles que deepSerialize pour envoyer l'intégralité du graphique et ne rompt pas avec les relations bidirectionnelles.

new JSONSerializer().deepSerialize(user); 

Le formatage des dates côté serveur est également souvent pratique

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

http://www.json.org/java/index.html a ce dont vous avez besoin.

Ouais!Vérifier json-lib

Voici une extrait de code simplifié de mon propre code qui envoie un ensemble d'objets de mon domaine :

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

J'ai trouvé Google-Gson convaincant.Il se convertit en JSON et inversement. http://code.google.com/p/google-gson/ Il est très flexible et peut gérer les complexités des objets de manière simple.J'adore son support pour les génériques.

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

Pour les services Web RESTful en Java, consultez également le API Restlet qui fournit une abstraction très puissante et flexible pour les services Web REST (à la fois serveur et client, dans un conteneur ou autonome), et s'intègre également bien avec Spring et JSON.

Comme déjà mentionné, Jersey (JAX-RS impl) est le framework à utiliser ;mais pour le mappage de base des objets Java vers/depuis JSON, Didacticiel est bon.Contrairement à de nombreuses alternatives, il n'utilise pas d'étranges conventions de compatibilité XML, mais lit et écrit du JSON propre qui mappe directement vers et depuis les objets.Il n'a également aucun problème avec null (il y a une différence entre une entrée manquante et une entrée nulle), des listes ou des chaînes vides (les deux sont distinctes des valeurs nulles).

Jackson fonctionne également bien avec Jersey, soit en utilisant le jar du fournisseur JAX-RS, soit même simplement manuellement.De même, il est trivialement facile à utiliser avec de vieilles servlets simples ;obtenez simplement le flux d'entrée/sortie, appelez ObjectMapper.readValue() et .writeValue(), et c'est tout.

J'utilise jaxws-json pour fournir des services Web au format JSON.vous pouvez vérifier le projet https://jax-ws-commons.dev.java.net/json/.

c'est un beau projet, une fois que vous l'aurez réalisé, vous découvrirez à quel point il est charmant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top