Pergunta

Existe uma maneira fácil de retornar dados para clientes de serviços web em JSON usando java?Estou bem com servlets, spring, etc.

Foi útil?

Solução

Para mim, o melhor analisador Java <-> JSON é XStream (sim, estou falando realmente de json, não de xml).XStream já lida com dependências circulares e possui uma API simples e poderosa onde você pode escrever seus drivers, conversores e assim por diante.

Atenciosamente

Outras dicas

Talvez valha a pena investigar Jersey.Jersey facilita a exposição de serviços da web tranquilos como xml e/ou JSON.

Um exemplo...comece com uma aula simples

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

Em seguida, crie um 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");
    }
}

e expô-lo.Há muitas maneiras de fazer isso, como usando o 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>

Isso é tudo que você precisa fazer...abra seu navegador e navegue até http://localhost/blah/1.Por padrão, você verá a saída XML.Se você estiver usando FireFox, instale o TamperData e altere seu accept cabeçalho para application/json para ver a saída JSON.

Obviamente há muito mais do que isso, mas Jersey torna tudo isso muito fácil.

Boa sorte!

Temos usado o Flexjson para converter objetos Java em JSON e achamos muito fácil de usar.http://flexjson.sourceforge.net

aqui estão alguns exemplos:

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

Possui alguns recursos interessantes, como deepSerialize, para enviar o gráfico inteiro e não quebra relacionamentos bidirecionais.

new JSONSerializer().deepSerialize(user); 

A formatação de datas no lado do servidor também costuma ser útil

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

http://www.json.org/java/index.html tem o que você precisa.

Sim!Confira json-lib

Aqui está um trecho de código simplificado do meu próprio código que enviam um conjunto de meus objetos de domínio:

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

Achei o google-gson atraente.Ele converte para JSON e vice-versa. http://code.google.com/p/google-gson/ É muito flexível e pode lidar com complexidades de objetos de maneira direta.Adoro seu apoio aos 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 serviços da web RESTful em Java, verifique também o API Restlet que fornece uma abstração muito poderosa e flexível para serviços web REST (servidor e cliente, em um contêiner ou independente) e também se integra perfeitamente com Spring e JSON.

Como já mencionado, Jersey (JAX-RS impl) é a estrutura a ser usada;mas para mapeamento básico de objetos Java de/para JSON, Tutorial é bom.Ao contrário de muitas alternativas, ele não usa convenções estranhas de compatibilidade com XML, mas lê e grava JSON limpo que mapeia diretamente de e para objetos.Ele também não tem problemas com nulo (há diferença entre entrada ausente e uma com nulo), listas ou strings vazias (ambas são distintas de nulos).

Jackson também funciona bem com Jersey, seja usando o jar do provedor JAX-RS ou até mesmo manualmente.Da mesma forma, é trivialmente fácil de usar com servlets antigos;basta obter o fluxo de entrada/saída, chamar ObjectMapper.readValue() e .writeValue(), e pronto.

Tenho usado o jaxws-json para fornecer serviços da web no formato JSON.você pode conferir o projeto https://jax-ws-commons.dev.java.net/json/.

é um projeto bacana, depois de colocá-lo em prática você descobrirá o quão charmoso é.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top