Pergunta

Eu estou olhando para um simples Json (de) serializador para Java que o trabalho poder com o GWT. Eu pesquisei um pouco e encontrei algumas soluções que tanto necessitam de anotar cada membro ou definir interfaces inúteis. Completamente um chato. Por que não temos algo realmente simples como

class MyBean {
    ...
}

new GoodSerializer().makeString(new MyBean());
new GoodSerializer().makeObject("{ ... }", MyBean.class)
Foi útil?

Solução

Dê uma olhada em GWT do Overlay Tipos . Acho que este é de longe a maneira mais fácil de trabalhar com JSON em GWT. Aqui está um exemplo de código modificado do artigo ligado:

public class Customer extends JavaScriptObject {
    public final native String getFirstName() /*-{ 
        return this.first_name;
    }-*/;
    public final native void setFirstName(String value) /*-{
        this.first_name = value;
    }-*/;
    public final native String getLastName() /*-{
        return this.last_name;
    }-*/;
    public final native void setLastName(String value) /*-{
        this.last_name = value;
    }-*/;
}

Depois de ter o tipo de sobreposição definida, é fácil criar um objeto JavaScript de JSON e acessar suas propriedades em Java:

public static final native Customer buildCustomer(String json) /*-{
    return eval('(' + json + ')');
}-*/;

Se você quiser a representação JSON do objeto novamente, você pode envolver o tipo de sobreposição em um JSONObject:

Customer customer = buildCustomer("{'Bart', 'Simpson'}");
customer.setFirstName("Lisa");
// Displays {"first_name":"Lisa","last_name":"Simpson"}
Window.alert(new JSONObject(customer).toString());

Outras dicas

Outra coisa a tentar é o novo quadro AutoBean introduzido com GWT 2.1.

Você definir as interfaces para seus feijões e uma fábrica que os vends e GWT gera implementações para você.

interface MyBean {
  String getFoo();
  void setFoo(String foo);
}

interface MyBiggerBean {
  List<MyBean> getBeans();
  void setBeans(List<MyBean> beans>;
}

interface Beanery extends AutoBeanFactory{
  AutoBean<MyBean> makeBean();
  AutoBean<MyBiggerBean> makeBigBean();
}

Beanery beanFactory = GWT.create(Beanery.class);

void go() {
  MyBean bean = beanFactory.makeBean().as();
  bean.setFoo("Hello, beans");
}

O AutoBeanCodex pode ser usado para serializar-los para e de JSON.

AutoBean<MyBean> autoBean = AutoBeanUtils.getAutoBean(bean);
String asJson = AutoBeanCodex.encode(autoBean).getPayload();

AutoBean<MyBean> autoBeanCloneAB = 
  AutoBeanCodex.decode(beanFactory, MyBean.class, asJson );

MyBean autoBeanClone = autoBeanCloneAB.as(); 
assertTrue(AutoBeanUtils.deepEquals(autoBean, autoBeanClone));

Eles trabalham no lado do servidor também - uso AutoBeanFactoryMagic.create(Beanery.class) vez de GWT.create(Beanery.class)

.

A maneira mais simples seria usar built-in API JSON do GWT. Aqui está a documentação . E aqui é um grande tutorial sobre como usá-lo.

É tão simples como isto:

String json = //json string
JSONValue value = JSONParser.parse(json);

O JSONValue API é muito legal. Ele permite que você encadear validações como você extrair valores do objeto JSON para que as exceções serão lançada se mal de qualquer coisa com o formato.

Parece que eu encontrei a resposta certa para a pergunta

Eu descobri que o feijão para JSON e JSON para conversão de feijão no GWT não é uma tarefa trivial. bibliotecas conhecidas não iria funcionar porque GWT exigiria o seu código-fonte completo e este código-fonte deve usar apenas classes Java que são amoung emulados pelo GWT. Além disso, você não pode usar a reflexão no GWT. requisitos muito difícil!

Eu encontrei a solução única existente chamado gwt-jsonizer . Ele usa um costume Generator classe e requer uma interface de satélite para cada bean "jsonable". Infelizmente, ele não funciona sem remendar na mais recente versão do GWT e não foi atualizado por um longo tempo.

Então, eu decidi pessoalmente que é mais barato e mais rápido para fazer meus feijão Khow como converter-se para e de JSON. Como esta:

public class SmartBean {
    private String name;

    public String getName() { return name; }
    public void setName(String value) { name = value;  }

    public JSONObject toJson() {
        JSONObject result = new JSONObject();
        result.put("name", new JSONString(this.name));
        return result;
    }
    public void fromJson(JSONObject value) {
        this.name = value.get("name").isString().stringValue();
    }

}

JSONxxxx são GWT built-in classes que fornecem suporte JSON de baixo nível.

RestyGWT é uma biblioteca poderosa para codificação ou decodificação de objetos Java para JSON em GWT:

import javax.ws.rs.POST;
...
public interface PizzaOrderCodec extends JsonEncoderDecoder<PizzaOrder> {
}

Depois:

// GWT will implement the interface for you
PizzaOrderCodec codec = GWT.create(PizzaOrderCodec.class);

// Encoding an object to json
PizzaOrder order = ... 
JSONValue json = codec.encode(order);

// decoding an object to from json
PizzaOrder other = codec.decode(json);

Ele também tem vários fácil de usar API para consumir serviços Web RESTful.

Tenha um bom tempo.

Verifique o seguinte:

GWT Professional JSON serializador: http://code.google.com/p/gwtprojsonserializer/

! Funciona com GWT 2.0 +!

json.org/java parece estar incluído no GWT estes dias:

gwt-servlet-deps.jar \ org \ json \

Ou, este projecto parece ser abrangente: http://code.google.com/p/piriti/

aplicações em Google Web Toolkit, páginas 510 a 522, o autor, Ryan Dewsbury, mostra como usar a geração de código GWT para fazer a serialização de e para documentos XML e JSON.

Você pode baixar o código aqui ; você quer que os pacotes de código capítulo 10, e, em seguida, você quer olhar no pacote src / com / gwtapps / serialização. Eu não vi uma licença para este código, mas ter enviado o autor para ver o que ele diz. Vou atualizar isso se ele responde.

problemas com essa solução:

  • Você tem que adicionar uma interface de marcador em todos os seus objetos que deseja serializados (ele usa java.io.Serializable, mas eu imagino que você poderia usar outros - se você estiver usando hibernate para o seu back-end, seus pojos já pode ser marcado como este).
  • O código suporta apenas propriedades de cadeia; pode ser prorrogado.
  • O código só é escrito para 1.4 e 1.5.

Assim, esta não é uma solução fora da caixa, mas um grande ponto de partida para alguém para construir um serializador JSON que se encaixa com GWT. Combine isso com um serializador JSON no lado do servidor, como JSON-lib e você está pronto para ir.

Eu também achei este projeto (mais uma vez, alguns interface de marcador é necessária).

Tente este serializador do Google Code: http://code.google.com/p/ JSON-io /

Se você precisa escrever ou ler JSON formato no Java, esta é a ferramenta para uso. Não há necessidade de criar aulas extras, etc. Converter um gráfico de objeto Java para o formato JSON em uma chamada. Fazer o oposto - criar uma cadeia JSON ou Stream para objetos Java. Esta é a biblioteca mais rápido que eu vi ainda a fazer isso. É mais rápido do que ObjectOutputStream e ObjectInputStream na maioria dos casos, que usam formato binário.

utilitário muito útil.

Você pode querer fazer o checkout este projecto https://gerrit.googlesource.com/gwtjsonrpc/

É uma biblioteca criada a fim de apoiar um sistema de revisão de código para o Android, Gerrit, mas é um módulo autónomo destinado a ser incorporado em qualquer projeto GWT, não apenas Gerrit.

Um tutorial razoável é provavelmente o README no nível superior do diretório. É bastante semelhante ao padrão GWT RPC mas usa a codificação JSON. Também foi construído com proteção XSRF.

Parece que estou respondendo a esta pergunta muito ...

Há uma página em code.google.com intitulado Usando GWT para JSON Mashups . É (infelizmente) maneira sobre a minha cabeça, como eu não estou familiarizado com o GWT, por isso não pode ser útil.

OK, eu apaguei a minha resposta anterior, porque acabou por ser exatamente o que você não queria.

Eu não sei como ele funciona bem com o GWT, mas usamos o JSON-lib biblioteca para serializar objetos em um projeto Java normal, onde eu trabalho.

Pode criar um JSONObject diretamente de um JavaBean, em seguida, usar o resultando toString de JSONObject () para obter de volta a string JSON real.

Da mesma forma, ele também pode transformar JSON de volta em um JavaBean .

Não tenho certeza se Jackson iria trabalhar para você. Eu não sei se há específicos do GWT que você está procurando; se não ele deve funcionar.

Mas a sua serialização / desserialização funciona muito bem, como:

// read json, create object
ObjectMapper mapper = new ObjectMapper();
MyBean bean = mapper.readValue(jsonAsString, MyBean.class);

// and write out
StringWriter sw = new StringWriter();
mapper.writeValue(sw, user);
String jsonOut = sw.toString();

Você faz acessores necessidade (getX() para serializar, setX() para deserialize; pode anotar métodos com outros nomes), mas que é sobre ele

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