问题已解决,at com.google.gson.internal.bind.DateTypeAdapter.deserializeToDate(DateTypeAdapter.java:81)

本文详细解析了使用Gson解析日期时出现的ParseException问题,并提供了使用阿里巴巴fastjson解决此问题的方法。通过实例展示了如何将日期字符串转换为ActivityTimeDo类的对象,避免了日期格式不匹配导致的解析错误。
com.google.gson.JsonSyntaxException: 2013-12-14 15:14:28
    at com.google.gson.internal.bind.DateTypeAdapter.deserializeToDate(DateTypeAdapter.java:81)
    at com.google.gson.internal.bind.DateTypeAdapter.read(DateTypeAdapter.java:66)
    at com.google.gson.internal.bind.DateTypeAdapter.read(DateTypeAdapter.java:41)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172)
    at com.google.gson.Gson.fromJson(Gson.java:795)
    at com.google.gson.Gson.fromJson(Gson.java:859)
    at com.google.gson.Gson.fromJson(Gson.java:832)
    at org.lazicats.ecos.view.permission.viewcomponent.impl.FullPreferentialViewComponent.addORupdateFullPreferential(FullPreferentialViewComponent.java:1066)
    at org.lazicats.ecos.view.permission.viewcomponent.impl.FullPreferentialViewComponent.addFullPreferential(FullPreferentialViewComponent.java:1043)
    at org.lazicats.ecos.view.permission.controller.FullPreferentialController.addFullPreferential(FullPreferentialController.java:317)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:100)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:604)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:565)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)
Caused by: java.text.ParseException: Unparseable date: "2013-12-14 15:14:28"
    at java.text.DateFormat.parse(DateFormat.java:357)
    at com.google.gson.internal.bind.DateTypeAdapter.deserializeToDate(DateTypeAdapter.java:79)
    ... 46 more

2013-12-15 15:31:56,935 [INFO] [org.lazicats.ecos.order.job.PreemptionWHStockJob.execute(PreemptionWHStockJob.java:27)] -





解决方案:

import com.alibaba.fastjson.JSON;


List<ActivityTimeDo> times = new ArrayList<ActivityTimeDo>();

times = JSON.parseArray(addVo.getListDate(), ActivityTimeDo.class);


这个错误: ``` java.lang.IllegalArgumentException: class Child declares multiple JSON fields named name ``` 是 **Gson** 在反序列化 JSON 字符串为 Java/Kotlin 对象时抛出的异常,意思是:**你定义的类 `Child` 中有多个字段被映射为同一个 JSON 字段名 `name`**,导致 Gson 无法决定该把值赋给哪个字段,因此抛出异常。 --- ### ✅ 示例重现 假设你有如下 Kotlin 类: ```kotlin data class Child( val name: String, @SerializedName("name") val customName: String ) ``` 当你尝试用 Gson 反序列化如下 JSON: ```json { "name": "Alice" } ``` Gson 会发现类中有两个字段都映射到 `"name"` 这个键(`name` 和 `customName`),就会抛出: ``` IllegalArgumentException: class Child declares multiple JSON fields named name ``` --- ### ✅ 解决方法 #### ✅ 方法 1:检查字段映射,确保唯一性 如果你并不想让两个字段映射到同一个 JSON 字段,**删除多余的 `@SerializedName("name")` 注解即可**: ```kotlin data class Child( val name: String, @SerializedName("customName") val customName: String // 修改映射字段名 ) ``` #### ✅ 方法 2:如果你确实想共享字段值(高级用法) 如果你确实希望两个字段接收相同的值,可以使用自定义反序列化器(TypeAdapter),而不是依赖自动映射机制。 --- ### ✅ 完整修复示例 #### ❌ 错误写法: ```kotlin data class Child( val name: String, @SerializedName("name") val customName: String // 冲突! ) ``` #### ✅ 正确写法: ```kotlin data class Child( val name: String, @SerializedName("customName") val customName: String // 不冲突 ) ``` 或者如果你希望两个字段都接收相同的值,建议使用自定义 `TypeAdapter` 或者使用 `@JsonAdapter` 注解。 --- ### ✅ 总结 | 问题 | 原因 | 解决方法 | |------|------|-----------| | 多个字段映射同一个 JSON key | 使用了多个 `@SerializedName("name")` | 检查字段映射,确保唯一 | | 不想改字段名但想共享值 | 需要自定义反序列化逻辑 | 使用 `TypeAdapter` 实现 | ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值