开发者社区> 问答> 正文

fastjson2反序列化时,不能识别特殊格式的时间字符串(但是fastjson1可以)

fastjson2反序列化时,不能识别特殊格式的时间字符串(但是fastjson1可以)

环境信息

OS信息: win10 JDK信息: jdk8 版本信息:Fastjson2 2.0.17

重现步骤

运行下述代码即可

import com.alibaba.fastjson2.JSON; import lombok.Data;

import java.io.Serializable; import java.time.LocalDateTime;

public class DemoApplication {

public static void main(String[] args) {
    String str = "{\"callTime\": \"2022-12-02T03:33:52.000+0000\"}";
    BizDTO bizDTO = JSON.parseObject(str, BizDTO.class);
    System.err.println("calltime=" + bizDTO.getCalltime());
}

@Data
public static class BizDTO implements Serializable {
    private LocalDateTime calltime;
}

}

期待的正确结果

fastjson2反序列化时能识别该格式的时间(注:fastjson1反序列化时能识别该时间的)

相关日志输出

实际fastjson2不能识别该时间,输出为null

calltime=null

原提问者GitHub用户JustryDeng

展开
收起
后端老大 2023-04-21 10:56:48 450 0
2 条回答
写回答
取消 提交回答
  • 这个是字段大小写不匹配的问题,加上上面这个就可以了

    BizDTO bizDTO = JSON.parseObject(str, BizDTO.class, JSONReader.Feature.SupportSmartMatch);

    原回答者GitHub用户wenshao

    2023-04-21 14:04:26
    赞同 展开评论 打赏
  • 随心分享,欢迎友善交流讨论:)

    在fastjson2中,时间字符串的格式默认为ISO-8601格式,例如:"yyyy-MM-dd'T'HH:mm:ss.SSSXXX",如果需要识别其他格式的时间字符串,需要使用自定义反序列化器(Deserializer)。

    以下是一个示例代码,演示如何使用自定义反序列化器来识别时间字符串:

    import java.lang.reflect.Type; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date;

    import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.parser.DefaultJSONParser; import com.alibaba.fastjson.parser.JSONToken; import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer;

    public class DateDeserializer implements ObjectDeserializer { private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Override
    public Date deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
        String dateString = parser.parseObject(String.class); // 读取时间字符串
        try {
            return dateFormat.parse(dateString);
        } catch (ParseException e) {
            throw new RuntimeException("parse date error", e);
        }
    }
    
    @Override
    public int getFastMatchToken() {
        return JSONToken.LITERAL_STRING;
    }
    

    }

    public class Test { public static void main(String[] args) { String json = "{"time":"2021/9/27 11:11:11"}"; JSON.DEFAULT_PARSER.getConfig().putDeserializer(Date.class, new DateDeserializer()); // 注册自定义反序列化器 Data data = JSON.parseObject(json, Data.class); System.out.println(data.getTime()); // 输出时间值 } }

    class Data { private Date time;

    public Date getTime() {
        return time;
    }
    
    public void setTime(Date time) {
        this.time = time;
    }
    

    } 在上述代码中,我们定义了一个自定义反序列化器DateDeserializer,它会读取字符串类型的时间值,并将其解析为Date类型。然后,我们将这个反序列化器注册到fastjson的解析器配置中,以便在反序列化时自动调用。

    最后,我们使用示例数据{"time":"2021/9/27 11:11:11"}来进行反序列化,并输出时间值。在这个示例中,我们将时间字符串的格式设为"yyyy-MM-dd HH:mm:ss",因此在反序列化时需要使用SimpleDateFormat进行解析。

    2023-04-21 12:03:25
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载