jackson替换fastjson语法糖

jackson替换fastjson语法糖

介绍

因fastjson经常出现漏洞需要更新,但是很多工程已接入需要批量修改代码特别麻烦,所以考虑使用语法糖形式,替换成jackson后操作习惯保持一致,通过批量替换import引用即可

注意问题

  1. 序列化如果对象存在递归引用的属性,会出现无限递归栈溢出的报错(JsonMappingException: Infinite recursion StackOverflowError);
  2. 非规范书写的属性fasjson可以自动识别成小驼峰(如:testmethod -> testMethod),本插件通过配置强制使用bean原本的属性名;
  3. 原jackson只支持ISO8601国际标准的时间格式,本插件通过自建dateFormat兼容国内常用的时间格式,保持和fastjson一致。

配置说明

与fastjson基本一致的配置,忽略位置属性和不返回null

// static method faster
private static ObjectMapper mapper;

static {
    mapper = new ObjectMapper();
    // pass unknown properties
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    // allow key no ""
    mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
    // allow key use ''
    mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
    // allow int startWith 0
    mapper.configure(JsonParser.Feature.ALLOW_NUMERIC_LEADING_ZEROS, true);
    // allow string exist \r \n \t
    mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
    // after serialization json properties exclude null
    mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    // use lower camel case
    mapper.setPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CAMEL_CASE);
    // use bean names
    mapper.enable(MapperFeature.USE_STD_BEAN_NAMING);
    // dateFormat problems
    JSONDateFormat smt = new JSONDateFormat();
    mapper.setDateFormat(smt);
    mapper.setTimeZone(DateUtils.DEFAULT_TIMEZONE);
}

自定义日期解析和格式化

@Override
public StringBuffer format(Date date, StringBuffer stringBuffer, FieldPosition fieldPosition) {
    TimeZone tz = DateUtils.DEFAULT_TIMEZONE;
    Calendar cal = (Calendar) DateUtils.CALENDAR.clone();
    cal.setLenient(true);
    cal.setTime(date);
    int year = cal.get(1);
    if (cal.get(0) == 0) {
        if (year == 1) {
            stringBuffer.append("+0000");
        } else {
            int isoYear = year - 1;
            stringBuffer.append('-');
            pad4(stringBuffer, isoYear);
        }
    } else {
        if (year > 9999) {
            stringBuffer.append('+');
        }

        pad4(stringBuffer, year);
    }

    stringBuffer.append('-');
    pad2(stringBuffer, cal.get(2) + 1);
    stringBuffer.append('-');
    pad2(stringBuffer, cal.get(5));
    stringBuffer.append(' ');
    pad2(stringBuffer, cal.get(11));
    stringBuffer.append(':');
    pad2(stringBuffer, cal.get(12));
    stringBuffer.append(':');
    pad2(stringBuffer, cal.get(13));
    stringBuffer.append('.');
    pad3(stringBuffer, cal.get(14));

    return stringBuffer;
}

public Date parse(String dateStr) throws ParseException {
    dateStr = StringUtils.trim(dateStr);
    if (StringUtils.isEmpty(dateStr)) {
        return null;
    }

    if (Pattern.compile("^\\d{13}$").matcher(dateStr).matches()) {
        return new Date(Long.valueOf(dateStr));
    } else if (Pattern.compile("^\\d{10}$").matcher(dateStr).matches()) {
        return new Date(Long.valueOf(dateStr + "000"));
    } else {
        for (Map.Entry<String, String> entry : dateRegFormat.entrySet()) {
            if (Pattern.compile(entry.getKey()).matcher(dateStr).matches()) {
                return DateUtils.parse(dateStr, entry.getValue());
            }
        }
    }
    return null;
}

下载链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
jacksonfastjson都是用于处理JSON数据的Java库。它们提供了序列化和反序列化JSON数据的功能。 在序列化方面,这两个库有一些差异。fastjson默认情况下不会序列化null值,也就是说如果一个属性的值是null,在序列化后,该属性将不会出现在JSON字符串中。而jackson则默认会序列化null值,即使属性的值为null,该属性也会在JSON字符串中呈现。 两个库在序列化时也有一些其他的功能配置。例如,fastjson可以通过设置fastjson的序列化过滤器进行定制化处理,还可以美化输出JSON字符串等。而jackson可以全局配置序列化的行为,比如将驼峰命名转换为下划线命名,忽略某些属性的序列化等。 在反序列化方面,fastjsonjackson都提供了相应的功能。它们可以将JSON字符串转化为Java对象。 总结来说,jacksonfastjson都是功能强大的Java库,用于处理JSON数据。它们在序列化和反序列化方面有一些差异,并且提供了不同的配置选项来满足不同的需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [jacksonfastjson](https://blog.csdn.net/xuxuxux123/article/details/126625323)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [JacksonFastJson快速入门(整合SpringMVC)](https://blog.csdn.net/qq_45173404/article/details/108417438)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值