Closed liujianming04 closed 2 years ago
去掉json$j属性,会执行成功:
由于json中的 "," 与schemaless的line协议(属性间使用 “,” 分割)相冲突导致 json$j 属性不能正常解析造成的error。如果使用2.4.0.12的TDengine可以将json中的逗号转义 "\\,"
。比如:"sensor,deviceId=sensor0 current=10.2,json$j=\"{\"f6\":\"tt\"\\,\"f7\":\"aa\"\\,\"f0\":\"tt\"\\,\"f1\":\"aa\"\\,\"f2\":\"tt\"\\,\"f3\":\"aa\"\\,\"f4\":\"tt\"\\,\"f5\":\"aa\"}\",phase=0.32,strAtri=\"123456781234567812345678\",voltage=219i 1647569782596"
最新代码已经修复这个问题,可以直接使用json文本。或是自行编译,或是等待官方新版本发布。
逗号加了转义,这样的数据,报错{"code":"internal error","message":"[0x203] Invalid value in client"}:
去掉json文本,其他是可以的
发现差异了,用postman调试,json文本中的双引号不加转义,逗号加转义,就可以写入到数据库,上一个comment不行是因为逗号加了转义,json文本的双引号也是加了转义。
但是字符串中有双引号,一般都是加转义的吧?所以新版本的json文本规范,对于双引号和逗号是怎么处理的,都不加转义?
对,json中对逗号加反斜线转义属于对bug的折中方案,修复后可以使用正常的json字符串
我看influx对json字符串的处理是:字符串中,双引号是转义,逗号是不转义,不知道tdengine是不是会跟这个对齐。如果tdengine的处理逻辑不一样,我们应用这边需要先判断字符串是不是json,然后针对json做特殊的处理,每个字段多一次判断可能会损耗点性能。
以下是influxdb的源码:
之后和influxdb一致
Java代码: ` public void batchInsert() { JSONObject json = new JSONObject(); json.put("f0", "tt"); json.put("f1", "aa"); json.put("f2", "tt"); json.put("f3", "aa"); json.put("f4", "tt"); json.put("f5", "aa"); json.put("f6", "tt"); json.put("f7", "aa");
}`
控制台异常信息: 建库=succ sensor,deviceId=sensor0 current=10.2,json$j="{\"f6\":\"tt\",\"f7\":\"aa\",\"f0\":\"tt\",\"f1\":\"aa\",\"f2\":\"tt\",\"f3\":\"aa\",\"f4\":\"tt\",\"f5\":\"aa\"}",phase=0.32,strAtri="123456781234567812345678",voltage=219i 1647569782596
org.springframework.web.client.HttpServerErrorException$InternalServerError: 500 Internal Server Error: [{"code":"internal error","message":"[0x21f] Invalid column length"}] at org.springframework.web.client.HttpServerErrorException.create(HttpServerErrorException.java:100) at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:186) at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:125) at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63) at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:782) at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:740) at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:674) at org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:449) at com.rootcloud.controller.InfluxController.batchInsert(InfluxController.java:112) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:878) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:792) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1589) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748)