[Não Resolvido]Representar List em Json

6 respostas
guilherme.dio

Bom dia…

Estou tentando representar um java.util.List em JSON, para ser utilizado em transações ajax, porém estou sem sucesso por enquanto, alguém saberia me dizer qual o modo correto de representar isso?

Por exemplo, representar este List da classe:

public Class Exemplo
{
   private List<String> listExemplo;
}

Obrigado.

6 Respostas

davidbuzatto

{ "listExemplo": [ "item1", "item2", "itemN" ] }

[]'s

guilherme.dio

Estou fazendo exatamente deste modo, e não da certo…

OBS: Estou usando o front controller do Spring para receber os dados em JSON, e ele inclusive me lança uma exception ao enviar um JSON representando um List deste modo:

[color=red]SEVERE: Servlet.service() for servlet [springmvc] in context with path [/Receitas] threw exception [Request processing failed; nested exception is java.lang.NumberFormatException: For input string: ""] with root cause
java.lang.NumberFormatException: For input string: ""
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:504)
	at java.lang.Integer.parseInt(Integer.java:527)
	at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:979)
	at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:921)
	at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:76)
	at org.springframework.validation.DataBinder.applyPropertyValues(DataBinder.java:692)
	at org.springframework.validation.DataBinder.doBind(DataBinder.java:588)
	at org.springframework.web.bind.WebDataBinder.doBind(WebDataBinder.java:191)
	at org.springframework.web.bind.ServletRequestDataBinder.bind(ServletRequestDataBinder.java:111)
	at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.doBind(AnnotationMethodHandlerAdapter.java:757)
	at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doBind(HandlerMethodInvoker.java:805)
	at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:359)
	at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:171)
	at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436)
	at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:669)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:585)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:722)[/color]
W

Ola,

eu acho que o problema esta na deserializacao da lista (JSON) que vc enviar do cliente, para a List no servidor.

Primeira coisa, da uma olhada se vc esta enviando os dados corretamente.
Se estiver enviando corretamente, eu sugiro vc usar uma biblioteca tipo o GSON http://code.google.com/p/google-gson/

Aqui tem um exemplo, este fazendo mais ou menos o que vc quer fazer:

//Daniel

guilherme.dio

Daniel, orbigado pela atenção !

Então, acredito que esteja tudo correto no envio dos dados, estou enviando via Ajax pelo JQuery por metodo POST:

var dadosTeste = 
{
   "listExemplo" : ["item1","item2","item3"]
};

$.post(url,dadosTeste);

Engraçado, que adicionei um Interceptor de teste para ver os dados antes de chegar no meu controller, e eles chegam corretamente em um Map que o String monta como parametros em um HttpServletRequest.

guilherme.dio

Alguém ?

guilherme.dio

Não consigo entender porque exceptions são causadas, sendo que meu JSON esta correto…
Agora estou tentando algo diferente para ver se da erro, estou tentando enviar um JSON para o Spring construir uma classe com atributos compostos:

public class ComposicaoTeste 
{
	private int numero;
	private Teste teste;

	public Teste getTeste() 
	{
		return teste;
	}
	public void setTeste(Teste teste)
	{
		this.teste = teste;
	}
	public void setNumero(int numero) 
	{
		this.numero = numero;
	}
	public int getNumero()
	{
		return numero;
	}

}
public class Teste 
{
	private String valorA;
	
	@Override
	public String toString() {
		return valorA;
	}
	
	public String getValorA() {
		return valorA;
	}
	public void setValorA(String valorA) {
		this.valorA = valorA;
	}
}

JSON:

{
   numero:15,
   teste:
  {
      valorA:"Este é o valor A"
  }
}

mas ao enviar para o Front Controller do Spring, um exception é lançado:

Jun 25, 2012 2:13:46 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [springmvc] in context with path [/Receitas] threw exception [Request processing failed; nested exception is org.springframework.beans.InvalidPropertyException: Invalid property 'teste[valorA]' of bean class [br.com.ggdio.receitas.test.ComposicaoTeste]: Property referenced in indexed property path 'teste[valorA]' is neither an array nor a List nor a Map; returned value was [Este é o valor A]] with root cause
org.springframework.beans.InvalidPropertyException: Invalid property 'teste[valorA]' of bean class [br.com.ggdio.receitas.test.ComposicaoTeste]: Property referenced in indexed property path 'teste[valorA]' is neither an array nor a List nor a Map; returned value was [Este é o valor A]
	at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:1034)
	at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:921)
	at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:76)
	at org.springframework.validation.DataBinder.applyPropertyValues(DataBinder.java:692)
	at org.springframework.validation.DataBinder.doBind(DataBinder.java:588)
	at org.springframework.web.bind.WebDataBinder.doBind(WebDataBinder.java:191)
	at org.springframework.web.bind.ServletRequestDataBinder.bind(ServletRequestDataBinder.java:111)
	at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.doBind(AnnotationMethodHandlerAdapter.java:757)
	at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doBind(HandlerMethodInvoker.java:805)
	at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:359)
	at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:171)
	at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436)
	at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:669)
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:574)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:722)

Não consigo entender mesmo o que esta acontecendo, esta tudo correto nos códigos, porque o Spring me enviar esses erros?

Criado 24 de junho de 2012
Ultima resposta 25 de jun. de 2012
Respostas 6
Participantes 3