fastjson
fastjson copied to clipboard
com.alibaba.fastjson.JSONException: TODO
com.alibaba.fastjson.JSONException: TODO at com.alibaba.fastjson.util.TypeUtils.getRawClass(TypeUtils.java:2019) at com.alibaba.fastjson.util.TypeUtils.createCollection(TypeUtils.java:1981) at com.alibaba.fastjson.serializer.CollectionCodec.deserialze(CollectionCodec.java:117) at com.alibaba.fastjson.parser.deserializer.DefaultFieldDeserializer.parseField(DefaultFieldDeserializer.java:71) at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.parseField(JavaBeanDeserializer.java:828) at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:630) at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:212) at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:208) at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:642) at com.alibaba.fastjson.JSON.parseObject(JSON.java:350) at com.alibaba.fastjson.JSON.parseObject(JSON.java:254) at com.alibaba.fastjson.JSON.parseObject(JSON.java:467) at com.djdg.product.api.sdk.service.StockService.operateStockRecord(StockService.java:59) at com.djdg.product.api.sdk.Service.operateStockRecord(Service.java:391) at com.djdg.pos.client.api.help.ProductHelper.generateWarehouseRecord(ProductHelper.java:78) at com.djdg.pos.client.api.help.OrderHelper.generateWarehouseRecord(OrderHelper.java:102) at com.djdg.pos.client.api.service.order.product.StoreProductOrderServiceImpl.orderPayedHandle(StoreProductOrderServiceImpl.java:546) at com.djdg.pos.client.api.service.order.product.StoreProductOrderServiceImpl.lambda$updateOrder$1(StoreProductOrderServiceImpl.java:298) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374) at java.util.stream.ReferencePipeline$Head.forEachOrdered(ReferencePipeline.java:590) at com.djdg.pos.client.api.service.order.product.StoreProductOrderServiceImpl.updateOrder(StoreProductOrderServiceImpl.java:289) at com.djdg.pos.client.api.rest.v1.CheckoutApi.updateStoreOrder(CheckoutApi.java:82) 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.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:137) at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:296) at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:250) at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:237) at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:356) at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:179) at org.jboss.resteasy.plugins.server.netty.RequestDispatcher.service(RequestDispatcher.java:83) at org.jboss.resteasy.plugins.server.netty.RequestHandler.messageReceived(RequestHandler.java:56) at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70) at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564) at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791) at org.jboss.netty.handler.execution.ChannelUpstreamEventRunnable.doRun(ChannelUpstreamEventRunnable.java:43) at org.jboss.netty.handler.execution.ChannelEventRunnable.run(ChannelEventRunnable.java:67) at org.jboss.netty.handler.execution.OrderedMemoryAwareThreadPoolExecutor$ChildExecutor.run(OrderedMemoryAwareThreadPoolExecutor.java:314) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745)
能否提供你用到的json和pojo结构, 如果能做个testcase最好了
还有能否提供fastjson的版本?
1.2.29版本,数据结构:
{"data":2660885,"count":0,"hasError":false,"errorCode":null,"errorMessage":null,"errorTrace":null,"status":0,"message":null}
不定时不定期出现,使用的下面这段代码进行解析
JSON.parseObject(entityStream, this.fastJsonConfig.getCharset(), type, this.fastJsonConfig.getFeatures())
返回的结果是这种数据结构 Result<Integer>
,其中Result如下
private long status;
private String message;
private T data;
private Integer count;
private boolean hasError;
private String errorCode;
private String errorMessage;
private String errorTrace;
感谢!
我也是1.2.29,也是出这个异常。SpringBoot + Feign+JDK 1.7.0_55。 JDK1.8就没有问题。
//抓取最近发现的数据
{"data":true,"code":200,"msg":"success","success":true}
///对应结构
public class Response {
private int code;
private String msg;
private T data;
private String success
}
//对应FeignClient
@FeignClient(name="xx", url="xxx")
public interface RemoteCall {
@RequestMapping("/targetUrl")
Response getData();
}
经过排查,发现是服务器jenkins打包机器使用的JDK是 java version "1.8.0_144" 而应用服务器 JDK 版本是 java version "1.7.0_55"
但是难以复现这个问题,应用服务器上面,时而有错,时而正常。
但建议 还是 尽量打包机器和应用服务器 使用相同版本。
完整异常
Caused by: com.alibaba.fastjson.JSONException: TODO
at com.alibaba.fastjson.util.TypeUtils.getRawClass(TypeUtils.java:1932)
at com.alibaba.fastjson.util.TypeUtils.createCollection(TypeUtils.java:1894)
at com.alibaba.fastjson.serializer.CollectionCodec.deserialze(CollectionCodec.java:117)
at com.alibaba.fastjson.parser.deserializer.DefaultFieldDeserializer.parseField(DefaultFieldDeserializer.java:71)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.parseField(JavaBeanDeserializer.java:791)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:596)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:188)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:184)
at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:642)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:350)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:318)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:281)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:381)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:463)
at com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter4.read(FastJsonHttpMessageConverter4.java:69)
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:95)
at org.springframework.cloud.netflix.feign.support.SpringDecoder.decode(SpringDecoder.java:57)
at org.springframework.cloud.netflix.feign.support.ResponseEntityDecoder.decode(ResponseEntityDecoder.java:47)
at feign.SynchronousMethodHandler.decode(SynchronousMethodHandler.java:161)
... 25 more
我是1.2.22版本,也有这个异常。诡异的是服务器上有这个异常,在本地测试就正常,JDK都是1.8,看不出别的问题。
com.alibaba.fastjson.JSONException: TODO
at com.alibaba.fastjson.util.TypeUtils.getRawClass(TypeUtils.java:1735) ~[fastjson-1.2.22.jar!/:?]
at com.alibaba.fastjson.util.TypeUtils.createCollection(TypeUtils.java:1697) ~[fastjson-1.2.22.jar!/:?]
at com.alibaba.fastjson.serializer.CollectionCodec.deserialze(CollectionCodec.java:119) ~[fastjson-1.2.22.jar!/:?]
at com.alibaba.fastjson.parser.deserializer.DefaultFieldDeserializer.parseField(DefaultFieldDeserializer.java:71) ~[fastjson-1.2.22.jar!/:?]
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.parseField(JavaBeanDeserializer.java:722) ~[fastjson-1.2.22.jar!/:?]
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:568) ~[fastjson-1.2.22.jar!/:?]
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:187) ~[fastjson-1.2.22.jar!/:?]
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:183) ~[fastjson-1.2.22.jar!/:?]
at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:624) ~[fastjson-1.2.22.jar!/:?]
at com.alibaba.fastjson.JSON.parseObject(JSON.java:339) ~[fastjson-1.2.22.jar!/:?]
at com.alibaba.fastjson.JSON.parseObject(JSON.java:243) ~[fastjson-1.2.22.jar!/:?]
at com.alibaba.fastjson.JSON.parseObject(JSON.java:456) ~[fastjson-1.2.22.jar!/:?]
好奇怪,也报了同样的错: fastjson版本:1.2.31
com.alibaba.fastjson.JSONException: TODO
同样的spring boot的fat jar,部署在两台机器上,只有一台机器报上面的错。 等转成json的字符串:
{
"code": 0,
"data": true,
"message": "OK",
"status": 0
}
对应的Java对象:
import lombok.Data;
import java.util.Date;
@Data
public class DataResult<T> {
private int status;
private String message;
private T data;
private Date time;
}
调用的API:
com.alibaba.fastjson.JSON.toJSONString()
报错的信息:
com.alibaba.fastjson.JSONException: TODO
at com.alibaba.fastjson.util.TypeUtils.getRawClass(TypeUtils.java:2019) ~[fastjson-1.2.31.jar!/:?]
at com.alibaba.fastjson.util.TypeUtils.createCollection(TypeUtils.java:1981) ~[fastjson-1.2.31.jar!/:?]
at com.alibaba.fastjson.serializer.CollectionCodec.deserialze(CollectionCodec.java:117) ~[fastjson-1.2.31.jar!/:?]
at com.alibaba.fastjson.parser.deserializer.DefaultFieldDeserializer.parseField(DefaultFieldDeserializer.java:71) ~[fastjson-1.2.31.jar!/:?]
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.parseField(JavaBeanDeserializer.java:828) ~[fastjson-1.2.31.jar!/:?]
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:630) ~[fastjson-1.2.31.jar!/:?]
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:212) ~[fastjson-1.2.31.jar!/:?]
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:208) ~[fastjson-1.2.31.jar!/:?]
at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:642) ~[fastjson-1.2.31.jar!/:?]
at com.alibaba.fastjson.JSON.parseObject(JSON.java:350) ~[fastjson-1.2.31.jar!/:?]
at com.alibaba.fastjson.JSON.parseObject(JSON.java:254) ~[fastjson-1.2.31.jar!/:?]
at com.alibaba.fastjson.JSON.parseObject(JSON.java:467) ~[fastjson-1.2.31.jar!/:?]
@helloworldtang 你能在某一台机器上复现吗?这两台机器的JDK版本是不是一样的?我一直想复现来着。还有你的Model 类?
@slankka 重新发布后,两台机器都开始报错了。刚才把报错的详细信息也粘上去了
温少建议升级到1.2.49,出现类似问题的同学可以试试
@su1216 这种是偶发的,怎么证明已经解决了呢?
对比了下1.2.31和1.2.49中com.alibaba.fastjson.util.TypeUtils.getRawClass, 在前两行代码有变化:
if (type instanceof Class<?>) {
return (Class<?>) type;
v1.2.31中:
public static Class<?> getRawClass(Type type) {
if (type instanceof Class<?>) {
return (Class<?>) type;
} else if (type instanceof ParameterizedType) {
return getRawClass(((ParameterizedType) type).getRawType());
} else {
throw new JSONException("TODO");
}
}
v1.2.49中:
public static Class<?> getRawClass(Type type) {
if (type instanceof Class) {
return (Class)type;
} else if (type instanceof ParameterizedType) {
return getRawClass(((ParameterizedType)type).getRawType());
} else {
throw new JSONException("TODO");
}
}
@helloworldtang 抱歉,之前看成另一个问题了。这个问题不了解。
@helloworldtang 我怎么没有看出有什么不同的地方?1.2.31和1.2.49中com.alibaba.fastjson.util.TypeUtils.getRawClass 前两行 没有变化啊
@slankka if (type instanceof Class<?>) { 变成 if (type instanceof Class) {
@helloworldtang 没有啊!!
我是1.2.54版本,也有这个异常。服务器上有这个异常,在本地mac系统测试就正常,JDK都是1.8 Exception: com.alibaba.fastjson.JSONException: TODO at com.alibaba.fastjson.util.TypeUtils.getRawClass(TypeUtils.java:1881) at com.alibaba.fastjson.util.TypeUtils.createCollection(TypeUtils.java:1843) at com.alibaba.fastjson.serializer.CollectionCodec.deserialze(CollectionCodec.java:117) at com.alibaba.fastjson.parser.deserializer.DefaultFieldDeserializer.parseField(DefaultFieldDeserializer.java:71) at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.parseField(JavaBeanDeserializer.java:790) at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:595) at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:188) at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:184) at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:642) at com.alibaba.fastjson.JSON.parseObject(JSON.java:350) at com.alibaba.fastjson.JSON.parseObject(JSON.java:254) at com.alibaba.fastjson.JSON.parseObject(JSON.java:467)
1.2.29版本,我也遇到了这个问题,所以各位大神有解决方案了么,是升级到1.2.49可以了么?
更新到最新的1.2.58版本,同样报这个错误,错误日志信息和上面都一样,都是在 TypeUtils.getRawClass这个里。各位大佬有解决方法么?这个报错很随机,有点任性啊
这个问题我也遇到了,jdk版本测试与本地都是1.8,但是我最终使用TypeReference解决了 原始写法(备注:RespBase是一个范型类型): RespBase base = JSON.parseObject(resultStr, RespBase.class); 第二种写法也不行: JSON.parseObject(resultStr, new TypeReference<RespBase>(){}); 最终使用下面的方式解决了: JSON.parseObject(resultStr, new TypeReference<RespBase<?>>(){})
结论: 推测fastjson对类型的推断处理没有做好,从抛出的异常:“TODO Exception”来看也是,因此对于范型的json转化时,最好加上类型变量或者通配符,希望能够到大家。
fastjson 1.2.28 使用反序列化泛型对象后: PlatformPage<User> userPage = JSON.parseObject(response.getResponseText(), new TypeReference<PlatformPage<User>>(){}); 上述代码运行后(正常运行),其他代码执行报错如: Result result = JSON.parseObject(response.getResponseText(), Result.class);
public class Result<T> implements Serializable { private boolean success; private String code; private String message; private T data; } 本地测试 无法复现。Jenkins 构建 k8s部署测试环境 每次都是
已使用jackjson 替换反斜线代码。 其他服务未发现上述问题
fastjson 1.2.28 使用反序列化泛型对象后: PlatformPage userPage = JSON.parseObject(response.getResponseText(), new TypeReference<PlatformPage>(){}); 上述代码运行后(正常运行),其他代码执行报错如: Result result = JSON.parseObject(response.getResponseText(), Result.class);
public class Result implements Serializable { private boolean success; private String code; private String message; private T data; } 本地测试 无法复现。Jenkins 构建 k8s部署测试环境 每次都是
已使用jackjson 替换反斜线代码。 其他服务未发现上述问题
为啥还在使用这么老的版本?
版本2.0.1 也遇到这个问题了
2.0.2 也有这个问题
2.0.1有这个问题,2.0.12没有这个问题
您好,我已经收到您的来信,会尽快处理。
2.0.26也有这样的问题,服务器上报错,本地是好的
您好,我已经收到您的来信,会尽快处理。