tburch/jsonblob

Keys in JSON with a '.' cause errors when saving

sitnarf opened this issue · 6 comments

When I try to upload larger data, this error occures.

How big is "larger data"? Can you add what you're trying to upload to this issue?

Thanks,
Tristan

Of course. For example even this one: http://31.31.74.146/rexik/application/assets/rexik.json.

Interesting. The cause is because I store the actual JSON you send to JSONBlob in MongoDB and it doesn't like having keys with a '.' in them:

2014-07-18T19:08:17.718480+00:00 heroku[router]: at=info method=POST path="/api/jsonBlob" host=jsonblob.com request_id=6075a163-ec4a-480b-a214-2d32f2baf3ef fwd="108.162.238.206" dyno=web.1 connect=1 service=260 status=500 bytes=29591
2014-07-18T19:08:17.727767+00:00 app[web.1]: ERROR [2014-07-18 19:08:17,715] [dw-675 - POST /api/jsonBlob] [6075a163-ec4a-480b-a214-2d32f2baf3ef] i.d.j.e.LoggingExceptionMapper: Error handling a request: c95284787d9c7dcb
2014-07-18T19:08:17.727773+00:00 app[web.1]: ! java.lang.IllegalArgumentException: Document field names can't have a . in them. (Bad Key: '1 - Copy.png')
2014-07-18T19:08:17.727775+00:00 app[web.1]: ! at com.mongodb.DBCollection.validateKey(DBCollection.java:1450) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727777+00:00 app[web.1]: ! at com.mongodb.DBCollection._checkKeys(DBCollection.java:1410) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727778+00:00 app[web.1]: ! at com.mongodb.DBCollection._checkValue(DBCollection.java:1433) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727780+00:00 app[web.1]: ! at com.mongodb.DBCollection._checkKeys(DBCollection.java:1411) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727781+00:00 app[web.1]: ! at com.mongodb.DBCollection._checkValue(DBCollection.java:1433) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727783+00:00 app[web.1]: ! at com.mongodb.DBCollection._checkKeys(DBCollection.java:1411) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727784+00:00 app[web.1]: ! at com.mongodb.DBCollection._checkObject(DBCollection.java:1397) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727786+00:00 app[web.1]: ! at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:221) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727787+00:00 app[web.1]: ! at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:204) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727789+00:00 app[web.1]: ! at com.mongodb.DBCollection.insert(DBCollection.java:76) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727791+00:00 app[web.1]: ! at com.mongodb.DBCollection.insert(DBCollection.java:60) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727792+00:00 app[web.1]: ! at com.mongodb.DBCollection.insert(DBCollection.java:105) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727794+00:00 app[web.1]: ! at com.lowtuna.jsonblob.core.BlobManager.create(BlobManager.java:112) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727795+00:00 app[web.1]: ! at com.lowtuna.jsonblob.resource.ApiResource.createJsonBlob(ApiResource.java:51) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727797+00:00 app[web.1]: ! at sun.reflect.GeneratedMethodAccessor26.invoke(Unknown Source) ~[na:na]
2014-07-18T19:08:17.727798+00:00 app[web.1]: ! at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0-jdk8-b107]
2014-07-18T19:08:17.727800+00:00 app[web.1]: ! at java.lang.reflect.Method.invoke(Method.java:491) ~[na:1.8.0-jdk8-b107]
2014-07-18T19:08:17.727801+00:00 app[web.1]: ! at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727803+00:00 app[web.1]: ! at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:205) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727805+00:00 app[web.1]: ! at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727806+00:00 app[web.1]: ! at com.codahale.metrics.jersey.InstrumentedResourceMethodDispatchProvider$TimedRequestDispatcher.dispatch(InstrumentedResourceMethodDispatchProvider.java:30) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727808+00:00 app[web.1]: ! at io.dropwizard.jersey.guava.OptionalResourceMethodDispatchAdapter$OptionalRequestDispatcher.dispatch(OptionalResourceMethodDispatchAdapter.java:37) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727809+00:00 app[web.1]: ! at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727811+00:00 app[web.1]: ! at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727812+00:00 app[web.1]: ! at com.sun.jersey.server.impl.uri.rules.ResourceObjectRule.accept(ResourceObjectRule.java:100) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727814+00:00 app[web.1]: ! at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727816+00:00 app[web.1]: ! at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727818+00:00 app[web.1]: ! at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1542) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727819+00:00 app[web.1]: ! at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1473) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727821+00:00 app[web.1]: ! at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1419) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727822+00:00 app[web.1]: ! at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1409) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727824+00:00 app[web.1]: ! at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:409) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727825+00:00 app[web.1]: ! at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:540) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727827+00:00 app[web.1]: ! at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:715) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727837+00:00 app[web.1]: ! at javax.servlet.http.HttpServlet.service(HttpServlet.java:848) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727846+00:00 app[web.1]: ! at io.dropwizard.jetty.NonblockingServletHolder.handle(NonblockingServletHolder.java:49) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727848+00:00 app[web.1]: ! at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1515) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727849+00:00 app[web.1]: ! at org.eclipse.jetty.servlets.UserAgentFilter.doFilter(UserAgentFilter.java:83) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727850+00:00 app[web.1]: ! at org.eclipse.jetty.servlets.GzipFilter.doFilter(GzipFilter.java:295) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727852+00:00 app[web.1]: ! at io.dropwizard.jetty.BiDiGzipFilter.doFilter(BiDiGzipFilter.java:127) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727853+00:00 app[web.1]: ! at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1486) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727855+00:00 app[web.1]: ! at io.dropwizard.servlets.ThreadNameFilter.doFilter(ThreadNameFilter.java:29) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727857+00:00 app[web.1]: ! at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1486) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727858+00:00 app[web.1]: ! at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:519) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727860+00:00 app[web.1]: ! at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1097) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727862+00:00 app[web.1]: ! at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:448) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727863+00:00 app[web.1]: ! at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1031) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727865+00:00 app[web.1]: ! at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:136) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727867+00:00 app[web.1]: ! at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727868+00:00 app[web.1]: ! at com.codahale.metrics.jetty9.InstrumentedHandler.handle(InstrumentedHandler.java:173) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727870+00:00 app[web.1]: ! at io.dropwizard.jetty.ContextRoutingHandler.handle(ContextRoutingHandler.java:38) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727871+00:00 app[web.1]: ! at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727873+00:00 app[web.1]: ! at org.eclipse.jetty.server.handler.RequestLogHandler.handle(RequestLogHandler.java:92) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727874+00:00 app[web.1]: ! at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727876+00:00 app[web.1]: ! at org.eclipse.jetty.server.handler.StatisticsHandler.handle(StatisticsHandler.java:162) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727877+00:00 app[web.1]: ! at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727879+00:00 app[web.1]: ! at org.eclipse.jetty.server.Server.handle(Server.java:446) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727880+00:00 app[web.1]: ! at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:271) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727882+00:00 app[web.1]: ! at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:246) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727883+00:00 app[web.1]: ! at org.eclipse.jetty.io.AbstractConnection$ReadCallback.run(AbstractConnection.java:358) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727884+00:00 app[web.1]: ! at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:601) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727886+00:00 app[web.1]: ! at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:532) ~[jsonblob.jar:na]
2014-07-18T19:08:17.727887+00:00 app[web.1]: ! at java.lang.Thread.run(Thread.java:724) ~[na:1.8.0-jdk8-b107]
2014-07-18T19:08:17.795764+00:00 app[web.1]: 74.202.23.134, 108.162.238.206 -  -  [18/Jul/2014:19:08:17 +0000] "POST /api/jsonBlob HTTP/1.1" 500 - "-" "curl/7.30.0" 255

I did this because I had always planned on letting users do other interesting things with the JSON Blobs they upload (like query across it), so I'll have to think about what to do in this case since what you're sending is valid JSON.

Interesting, you can replace . with some special character / sequence of characters on input and do it in reverse order when sending to output : ) Someting like dot and if input key would contain this you would need to escape it like dot____dot or something, which would resoult in dot on output.

👍

Fixed this a while ago...