Vraptor 3 - JSON

9 respostas
yorgan

Bom dia pessoal,

Estou utilizando o VRaptor juntamente com Ext JS e preciso preencher os formlários com requisições AJAX.
O problema disso é que o retorno utilizando JSON me traz apenas o nome do atributo, enquanto que no formulário eu preciso setar o nome do campo com o padrão [objeto].[atributo], para que assim eu possa receber o objeto montado no construtor do método.
Existe alguma forma dos atributos que serão serializados no JSON serem nomeados com o padrão [objeto].[atributo]?

[]´s

Daniel

9 Respostas

J

Se vc fizer desta forma nao serve

this.result.use(Results.json()).from(this.lista(), nomeObjeto).serialize();
Lucas_Cavalcanti

até dá pra fazer… mas é mais fácil vc fazer isso no javascript com o resultado do JSON…

{'cliente': {
   'nome': 'Joao',
   'endereco': {
      'rua': 'dos patos',
      'cidade': 'far far away'
   }   
}}

se vc vai fazer algo genérico, vai ser algo do tipo:

function processaJSON(json, base) {
   if (base) { base = base + "."; }
   for(campo in json) {
      if (<campo é um objeto>)
        processaJSON(json[campo], base + campo);
      else
        <adiciona o input chamado base + campo>
   }
}

json = // o json
processaJSON(json);
yorgan

Certo, mas se eu não quisesse deixar isso para ser processado no lado do cliente, como eu faria isso diretamente no controller?

Só para deixar claro o que eu preciso fazer:

JSON Original:

{'cliente': {  
    'nome': 'Joao',  
    'endereco': {  
       'rua': 'dos patos',  
       'cidade': 'far far away'  
    }     
 }}

JSON modificado:

{'cliente': {  
    'cliente.nome': 'Joao',  
    'cliente.endereco': {  
       'cliente.endereco.rua': 'dos patos',  
       'cliente.endereco.cidade': 'far far away'  
    }     
 }}

[]´s

Daniel

Lucas_Cavalcanti

vc vai ter que sobrescrever a classe do vraptor que serializa JSON (XStreamJSONSerializer) pra poder configurar o XStream (sobrescrevendo o método getXStream)

no XStream vc vai ter que adicionar um Converter que vai fazer isso que vc quer…

não é nem um pouco fácil… é bem mais fácil fazer via javascript…

qual o problema de fazer isso por javascript? não vai ficar lento… vai levar praticamente o mesmo tempo que leva pra montar o form na mão…
ou vc tá usando alguma biblioteca JS que já espera o JSON do jeito que vc falou?

de qqer forma, eu posso te mandar um código javascript que converte o json q o vraptor gera num json do jeito q vc quer, que acha?

yorgan

Então, estou utilizando Ext JS e preenchendo da seguinte maneira:

...codigo....

this.form.load({
      url: '/vraptor/json/',
});

...codigo...

[]´s

Daniel

Lucas_Cavalcanti

então na verdade o que vc precisa é um json do tipo:

{
     'cliente.nome': 'Joao',    
     'cliente.endereco.rua': 'dos patos',    
     'cliente.endereco.cidade': 'far far away'    
 }

geralmente as bibliotecas JS dão a possibilidade de vc tratar o resultado da url… vc sabe quais são as options possíveis pra passar nesse this.form.load?

yorgan
Segundo a documentação são as seguintes:

[b]

* url : String

The url for the action (defaults to the forms url.)

* method : String

The form method to use (defaults to the forms method, or POST if not defined)

* params : String/Object
The params to pass (defaults to the form's baseParams, or none if not defined)

  Parameters are encoded as standard HTTP parameters using Ext.urlEncode.
* headers : Object
  Request headers to set for the action (defaults to the form's default headers)
* success : Function
  The callback that will be invoked after a successful response (see top of submit and load for a description of what constitutes a successful response). The function is passed the following parameters:
      o form : Ext.form.BasicForm
        The form that requested the action
      o action : The Action object which performed the operation.
        The action object contains these properties of interest:
            + response
            + result : interrogate for custom postprocessing
            + type
* failure : Function
  The callback that will be invoked after a failed transaction attempt. The function is passed the following parameters:
      o form : The Ext.form.BasicForm that requested the action.
      o action : The Action object which performed the operation.
        The action object contains these properties of interest:
            + failureType
            + response
            + result : interrogate for custom postprocessing
            + type
* scope : Object
  The scope in which to call the callback functions (The this reference for the callback functions).
* clientValidation : Boolean
  Submit Action only. Determines whether a Form's fields are validated in a final call to isValid prior to submission. Set to false to prevent this. If undefined, pre-submission field validation is performed.[/b]

Estou vendo que o Ext JS utiliza muitos padrões para o load de JSON.
Alguns casos ele precisa do SUCCESS, outros não, e por aí vai.

Talves o ideal seria poder serializar diretamente uma String. Tipo, o que vier nela e serializado.
Assim eu poderia criar classes para montagem desses JSON.

Lucas_Cavalcanti

bom, existe uma option chamada success…

tenta ver se vc consegue modificar o json com ela:

this.form.load({  
       url: '/vraptor/json/', 
       success: function(form, action) {
           //tenta mexer no action.response ou action.result
       }
});

se vc conseguir, é só converter o json

yorgan

O problema é que ele não vai entrar no success. Ta certo que posso tratar no failure, mas ainda acho que o ideal seria poder serializar objetos no padrão do Ext JS.

Como ele serializa no padrão:

{"objeto": {
  "atributo1": valor,
  "atributo2": "valor",
  "atributo3": "valor",
  "atributon": "valor"
}}

Eu não tenho como colocar o success junto.

Criado 15 de abril de 2010
Ultima resposta 15 de abr. de 2010
Respostas 9
Participantes 3