Comment exposer des données au format JSON via un service web utilisant Java?

Existe-t-il un moyen facile de renvoyer des données aux clients de service web en JSON en utilisant java? Je vais bien avec les servlets, le printemps, etc.

21
demandé sur Adrian Anttila 2008-09-12 01:19:30

9 réponses

Pour moi, Le meilleur analyseur Java JSON est XStream (Oui, je parle vraiment de json, pas de xml). XStream traite déjà des dépendances circulaires et dispose d'une api simple et puissante où vous pouvez écrire vos pilotes, Convertisseurs et ainsi de suite.

Cordialement

5
répondu marcospereira 2008-09-12 01:40:11

, Il pourrait être intéressant de regarder dans Maillot. Jersey permet d'exposer facilement les services web restful en xml et / ou JSON.

Un exemple... commencez avec une classe 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; }
}

Puis créez 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 l'exposer. Il y a plusieurs façons de le faire, 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 la sortie XML. Si vous utilisez FireFox, Installez TamperData et changez votre en-tête accept en application/json pour voir la sortie JSON.

Évidemment, il y a beaucoup plus à cela, mais Jersey rend tout cela assez facile.

Bonne chance!

17
répondu blahspam 2008-09-16 16:02:41

Nous avons utilisé Flexjson pour convertir des objets Java en JSON et 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 a quelques fonctionnalités intéressantes telles que deepSerialize pour envoyer le graphique entier et il ne rompt pas avec les relations bidirectionnelles.

new JSONSerializer().deepSerialize(user); 

Le formatage des dates côté serveur est souvent très pratique

new JSONSerializer().transform(
  new DateTransformer("dd/MM/yyyy"),"startDate","endDate"
).serialize(contract);
7
répondu Geekygecko 2008-09-12 00:52:14

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

4
répondu 2008-09-11 21:41:40

Ouaip! Consultez JSON-lib

Voici un extrait de code simplifié de mon propre code {[7] } 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;
}
3
répondu Stu Thompson 2008-09-16 12:50:28

J'ai trouvé Google-gson convaincant. Il se convertit en JSON et retour. http://code.google.com/p/google-gson/ il est très flexible et peut gérer les complexités avec les objets d'une manière simple. J'aime son soutien 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);
2
répondu jon 2010-03-02 17:43:49

Pour les services web RESTful en Java, consultez également l'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.

1
répondu Henning 2008-09-15 13:23:22

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

Jackson travaille bien avec Jersey aussi bien, soit en utilisant jar fournisseur JAX-RS, ou même simplement manuellement. De même, il est trivialement facile à utiliser avec de vieux servlets simples; il suffit d'obtenir un flux d'entrée / sortie, appelez ObjectMapper.readValue() et .writeValue (), et c'est à ce sujet.

1
répondu StaxMan 2009-04-24 18:25:19

J'ai utilisé 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'obtenez, vous trouverez comment charmants c'est.

1
répondu lwpro2 2010-09-21 03:14:41