Vraptor 3 - JSON

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

Se vc fizer desta forma nao serve

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

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

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

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?

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

...codigo....

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

...codigo...

[]´s

Daniel

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?

Segundo a documentação são as seguintes:
[b]
* url : String
The url for the action (defaults to the form’s url.)
* method : String
The form method to use (defaults to the form’s 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.

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

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.