Json - obter data e hora

4 respostas
cinei

Estou apanhando em uma função onde tento pegar data e hora do banco, do tipo Calendar:

View:

function procurarAgendaVariavel(id){
	$.getJSON("../processo/procurarAgendaVariavel", { 'idAgenda':id }, function(data) {  
     $.each(data,function(index, optionData){
    	  $('input[name=agendaVariavel.inicio]').val(optionData.inicio); // tipo Calendar
    	  $('input[name=agendaVariavel.id]').val(optionData.id);
	  });  
	});
}

Controller:

@Path("/processo/procurarAgendaVariavel")
public void procurarAgendaVariavel(Long idAgenda){
	AgendaVariavel agenda = agendaVariavelDao.procura(idAgenda);
	result.use(Results.json()).from(agenda).serialize();   //agenda.inicio - é do tipo Calendar
}

Já tentei de várias formas e o máximo que consegui foi um número sem significado!
Esta é minha primeira tentativa de utilizar json.
Agradeço pelas dicas.

4 Respostas

Lucas_Cavalcanti

agendaVariavel é um objeto só, correto?

do jeito que tá o VRaptor vai gerar o json assim:

{"agendaVariavel" : {
   "inicio" : ".....",
   "id" : "....",
   ...
}}

ou seja, no getJSON vc tem que fazer isso:

$.getJSON("../processo/procurarAgendaVariavel", { 'idAgenda':id }, function(data) {    
     var agenda = data.agendaVariavel;
     $('input[name=agendaVariavel.inicio]').val(agenda.inicio); // tipo Calendar  
     $('input[name=agendaVariavel.id]').val(agenda.id);  
});
cinei

Pois é Lucas… devo estar cometendo algum erro.
Para o campo id (Long), o valor vem certo, mas o campo do tipo Calendar o valor é: [object Object].
Por desencargo, tentei assim também:

$('input[name=agendaVariavel.inicio]').val(agenda.inicio.time);

Mas o valor é: 127272030000000.
Valeu pela resposta.

Lucas_Cavalcanti

vc pode usar algum plugin do JQuery pra formatar a data, ou fazer isso do lado do java, criando um converter de calendar.

na parte java seria algo assim:

@Component
public class CustomXStreamJSONSerialization extends XStreamJSONSerialization {
    //delega o construtor

   protected XStream getXStream() {
        XStream stream = super.getXStream();

       stream.registerConverter(new Converter() {
              public boolean canConvert(Class type) {
                     return Calendar.class.isAssignableFrom(type);
              }
              public Object marshal(Object obj, ...) {
                    Calendar calendar = (Calendar) obj;

                    String formatado = //formate o calendar pro que vc precisa
                    return formatado;
              }

              //pode deixar o unmarshall em branco
       });

   }

}

criando a classe acima deve ser o suficiente.

cinei

Lucas, nao consegui deixar como sugeriu, mas juntando com outros posts seus, ficou assim:

public class CustomDateConverter extends AbstractSingleValueConverter {

	@SuppressWarnings("rawtypes")
	@Override
	public boolean canConvert(Class type) {  
		return Calendar.class.isAssignableFrom(type);  
	}  

	@Override
	public Object fromString(String arg0) {
		return null;
	}

	@Override
	public String toString(Object obj) {
		SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");

		Calendar calendar = (Calendar) obj;
		try {
			return dateFormat.format(calendar.getTime());
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
}
@Component  
public class CustomXStreamJSONSerialization extends XStreamJSONSerialization {  

	public CustomXStreamJSONSerialization(HttpServletResponse response,
			TypeNameExtractor extractor, ProxyInitializer initializer) {
		super(response, extractor, initializer);
	}

	@Override  
	protected XStream getXStream() {  
		XStream stream = super.getXStream();  
		stream.registerConverter(new CustomDateConverter());  
		return stream;  
	}  
}

View:

...
		<input type='text' name='agendaVariavel.inicio'  id='agendaVariavel.inicio'  class="mask-dataHora" /> 
...

$(document).ready(function() { 
	$('.mask-dataHora').mask('99/99/9999 99:99:00'); // mascara para data e hora
}); 
...

function procurarAgendaVariavel(id){
	$.getJSON("../processo/procurarAgendaVariavel", { 'idAgenda':id }, function(data) {
		  var agenda = data.agendaVariavel;  
		  $('input[name=agendaVariavel.inicio]').val(agenda.inicio);
		  $('input[name=agendaVariavel.id]').val(agenda.id);
	});  
}

Com Jquery e jquery.maskedinput, ficou muito bom.
Obrigado pela ajuda.

Criado 28 de novembro de 2010
Ultima resposta 29 de nov. de 2010
Respostas 4
Participantes 2