PDA

View Full Version : JSONException when formatting to JSON



ThomasBecker
Feb 28th, 2011, 09:38 AM
Hi all,

I'm using grails to feed some android clients using json format. I do some custom marshalling with "JSON.registerObjectMarshaller(SomeObject)" and all seems to work fine. Besides the fact that I'm getting the following exception for each request with Accept header set to text/json or application/json:



converters.JSONParsingParameterCreationListener Error parsing incoming JSON request: Error parsing JSON
org.codehaus.groovy.grails.web.converters.exceptio ns.ConverterException: Error parsing JSON
at grails.converters.JSON.parse(JSON.java:289)
at grails.converters.JSON.parse(JSON.java:311)
at grails.converters.JSON.parse(JSON.java:334)
at grails.converters.JSON$parse.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray .defaultCall(CallSiteArray.java:40)
at org.codehaus.groovy.runtime.callsite.AbstractCallS ite.call(AbstractCallSite.java:116)
at org.codehaus.groovy.runtime.callsite.AbstractCallS ite.call(AbstractCallSite.java:124)
at org.codehaus.groovy.grails.web.converters.JSONPars ingParameterCreationListener.paramsCreated(JSONPar singParameterCreationListener.groovy:42)
at org.codehaus.groovy.grails.web.servlet.mvc.GrailsW ebRequest.informParameterCreationListeners(GrailsW ebRequest.java:171)
at org.codehaus.groovy.grails.web.mapping.filter.UrlM appingsFilter.doFilterInternal(UrlMappingsFilter.j ava:181)
at org.springframework.web.filter.OncePerRequestFilte r.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.in ternalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.do Filter(ApplicationFilterChain.java:206)
at org.codehaus.groovy.grails.web.sitemesh.GrailsPage Filter.obtainContent(GrailsPageFilter.java:245)
at org.codehaus.groovy.grails.web.sitemesh.GrailsPage Filter.doFilter(GrailsPageFilter.java:134)
at org.apache.catalina.core.ApplicationFilterChain.in ternalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.do Filter(ApplicationFilterChain.java:206)
at org.codehaus.groovy.grails.web.servlet.filter.Grai lsReloadServletFilter.doFilterInternal(GrailsReloa dServletFilter.java:104)
at org.springframework.web.filter.OncePerRequestFilte r.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.in ternalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.do Filter(ApplicationFilterChain.java:206)
at org.codehaus.groovy.grails.web.servlet.mvc.GrailsW ebRequestFilter.doFilterInternal(GrailsWebRequestF ilter.java:69)
at org.springframework.web.filter.OncePerRequestFilte r.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.in ternalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.do Filter(ApplicationFilterChain.java:206)
at org.codehaus.groovy.grails.web.filters.HiddenHttpM ethodFilter.doFilterInternal(HiddenHttpMethodFilte r.java:69)
at org.springframework.web.filter.OncePerRequestFilte r.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.in ternalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.do Filter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.CharacterEncodingFi lter.doFilterInternal(CharacterEncodingFilter.java :88)
at org.springframework.web.filter.OncePerRequestFilte r.doFilter(OncePerRequestFilter.java:76)
at org.springframework.web.filter.DelegatingFilterPro xy.invokeDelegate(DelegatingFilterProxy.java:237)
at org.springframework.web.filter.DelegatingFilterPro xy.doFilter(DelegatingFilterProxy.java:167)
at org.apache.catalina.core.ApplicationFilterChain.in ternalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.do Filter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invo ke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invo ke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke( StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invok e(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.servic e(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(H ttp11Processor.java:849)
at org.apache.coyote.http11.Http11Protocol$Http11Conn ectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run( JIoEndpoint.java:454)
at java.lang.Thread.run(Thread.java:680)
Caused by: org.codehaus.groovy.grails.web.json.JSONException: Missing value. at character 0 of
at org.codehaus.groovy.grails.web.json.JSONTokener.sy ntaxError(JSONTokener.java:473)
at org.codehaus.groovy.grails.web.json.JSONTokener.ne xtValue(JSONTokener.java:358)
at grails.converters.JSON.parse(JSON.java:280)
... 44 more


It doesn't seem to cause any (obvious) harm, but I really don't want to have this in production server logs. I googled and found lots of people having the same exception without any harm. However nobody seems to have a solution which helped me.

I tried several things like getting rid of my custom marshallers, changing some objects, etc. ... no joy.

Any hint where to look at would be appreciated.

Thanks a lot!
Thomas

pledbrook
Mar 9th, 2011, 06:02 AM
Do you need to parse incoming JSON and inject the data into 'params'? This is part of content negotiation. If you don't need content negotiation, set the 'grails.mime.types' config value to an empty map:



grails.mime.types = [:]


In fact, you can just remove the entry for JSON to fix this particular issue.

ThomasBecker
Apr 15th, 2011, 11:39 AM
As I have requests containing json which needs to get parsed your suggestion is not an option. So I had a look at the sources and the fix is pretty easy. Was not so easy to find out that the grails jars are taken form the ivy2 repo...grrr... :)

Change line 37 of JSONParsingParameterCreationListener to:



if (request.format != 'json' || request.getContentLength()<1) {


I will open a JIRA for this as lots of other ppl seem to have the same issue.

ThomasBecker
Apr 15th, 2011, 11:44 AM
Here's the JIRA: http://jira.grails.org/browse/GRAILS-7445