fastjson icon indicating copy to clipboard operation
fastjson copied to clipboard

com.alibaba.fastjson.JSONException: TODO

Open Abelsf opened this issue 7 years ago • 24 comments

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)

Abelsf avatar Jun 12 '17 12:06 Abelsf

能否提供你用到的json和pojo结构, 如果能做个testcase最好了

kimmking avatar Jun 14 '17 03:06 kimmking

还有能否提供fastjson的版本?

wenshao avatar Jun 25 '17 17:06 wenshao

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;

感谢!

mustfun avatar Nov 22 '17 09:11 mustfun

我也是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 

slankka avatar Jan 24 '18 03:01 slankka

我是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!/:?]

nicksheng avatar Jun 13 '18 11:06 nicksheng

好奇怪,也报了同样的错: 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 avatar Jul 06 '18 05:07 helloworldtang

@helloworldtang 你能在某一台机器上复现吗?这两台机器的JDK版本是不是一样的?我一直想复现来着。还有你的Model 类?

slankka avatar Jul 06 '18 06:07 slankka

@slankka 重新发布后,两台机器都开始报错了。刚才把报错的详细信息也粘上去了

helloworldtang avatar Jul 06 '18 11:07 helloworldtang

温少建议升级到1.2.49,出现类似问题的同学可以试试

helloworldtang avatar Aug 09 '18 06:08 helloworldtang

@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 avatar Aug 09 '18 07:08 helloworldtang

@helloworldtang 抱歉,之前看成另一个问题了。这个问题不了解。

su1216 avatar Aug 09 '18 07:08 su1216

@helloworldtang 我怎么没有看出有什么不同的地方?1.2.31和1.2.49中com.alibaba.fastjson.util.TypeUtils.getRawClass 前两行 没有变化啊

slankka avatar Aug 10 '18 09:08 slankka

@slankka if (type instanceof Class<?>) { 变成 if (type instanceof Class) {

helloworldtang avatar Aug 18 '18 08:08 helloworldtang

fastjsontypeutil @helloworldtang 没有啊!!

slankka avatar Aug 18 '18 11:08 slankka

我是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)

jannal avatar Apr 01 '19 08:04 jannal

1.2.29版本,我也遇到了这个问题,所以各位大神有解决方案了么,是升级到1.2.49可以了么?

VinneyZheng avatar Aug 13 '19 08:08 VinneyZheng

更新到最新的1.2.58版本,同样报这个错误,错误日志信息和上面都一样,都是在 TypeUtils.getRawClass这个里。各位大佬有解决方法么?这个报错很随机,有点任性啊

zhangptang avatar Nov 27 '19 09:11 zhangptang

这个问题我也遇到了,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转化时,最好加上类型变量或者通配符,希望能够到大家。

hhli avatar Mar 30 '20 08:03 hhli

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 替换反斜线代码。 其他服务未发现上述问题

vicoolee avatar Mar 25 '22 09:03 vicoolee

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 替换反斜线代码。 其他服务未发现上述问题

为啥还在使用这么老的版本?

harkue avatar Mar 25 '22 09:03 harkue

版本2.0.1 也遇到这个问题了

slliver avatar Jun 02 '22 06:06 slliver

2.0.2 也有这个问题

Times125 avatar Jul 08 '22 11:07 Times125

2.0.1有这个问题,2.0.12没有这个问题

ruizhanglei avatar Aug 30 '22 07:08 ruizhanglei

您好,我已经收到您的来信,会尽快处理。

Times125 avatar Aug 30 '22 07:08 Times125

2.0.26也有这样的问题,服务器上报错,本地是好的

liuzhebaba avatar Mar 29 '23 08:03 liuzhebaba

您好,我已经收到您的来信,会尽快处理。

Times125 avatar Mar 29 '23 08:03 Times125