用了几年的 Fastjson,我最终替换成了Jackson!

弃掉fastjson,改回jackson 记得年前升级过一次fastjson,版本1.2.60,安全要求用到fastjson的全部升级,结果一扫一大片,用的人还真不少。许多使用springboot整体打包的同事,都是升级fastjson后重新打包,上传,重新发布应用。 小编所在部门相关springboot项目都进行了jar包分离(参见:如何分离构建业务jar,配置文件,第三方依赖jar),升级只是替换了一个fastjson的jar包,然后重启应用。可是这没过多久,安全再次要求升级fastjson了,这次改换使用jackson了,使用起来同样简单明了 阅读详情

来源:cnblogs.com/larva-zhh/p/11544317.html

为什么要替换fastjson

工程里大量使用了fastjson作为序列化和反序列化框架,甚至ORM在处理部分字段也依赖fastjson进行序列化和反序列化。那么作为大量使用的基础框架,为什么还要进行替换呢?

原因有以下几点:

  1. fastjson太过于侧重性能,对于部分高级特性支持不够,而且部分自定义特性完全偏离了json和js规范导致和其他框架不兼容;

  2. fastjson文档缺失较多,部分Feature甚至没有文档,而且代码缺少注释较为晦涩;

  3. fastjson的CVE bug监测较弱,很多CVE数据库网站上有关fastjson的CVE寥寥无几,例如近期的AutoType导致的高危漏洞,虽然和Jackson的PolymorphicDeserialization是同样的bug,但是CVE网站上几乎没有fastjson的bug报告。

框架选型

参考mvnrepository json libraries,根据流行度排序后前十名框架:

  • jackson2(com.fasterxml.jackson)

  • gson

  • org.json

  • jackson1(com.codehuas.jackson)

  • fastjson

  • cheshire

  • json-simple

jackson1是已经过时的框架,因此可以忽略,cheshire和json-simple排名尚且不如fastjson,也忽略,剩余jackson2、gson以及org.json,其中org.json的使用量(usage)远小于jackson2(方便起见,下文均以jackson均指代jackson2)和gson,因此org.json也可以排除了。

关于jackson和gson的比较文章有很多,stackoverflow上自行搜索,下面仅推荐几篇blog:

  • jackson vs gson

  • JSON in Java

  • the ultimate json library json-simple vs gson vs jackson vs json

在功能特性支持、稳定性、可扩展性、易用性以及社区活跃度上 jackson 和 gson 差不多,入门教程可以分别参考baeldung jackson系列 以及 baeldung gson系列。但是jackson有更多现成的类库兼容支持例如jackson-datatype-commons-lang3,以及更丰富的输出数据格式支持例如jackson-dataformat-yaml,而且spring框架默认使用jackson,因此最终我选择使用jackson。

PS: Jackson 2.10.0开始尝试基于新的API使用白名单机制来避免RCE漏洞,详见https://github.com/FasterXML/jackson-databind/issues/2195,效果尚待观察。

替换fastjson

fastjson常见的使用场景就是序列化和反序列化,偶尔会有JSONObject和JSONArray实例的相关操作。

以下步骤的源码分析基于以下版本:

  • fastjson v1.2.60

  • jackson-core v2.9.9

  • jackson-annotations v2.9.0

  • jackson-databind v2.9.9.3

Deserialization

fastjson将json字符串反序列化成Java Bean通常使用com.alibaba.fastjson.JSON的静态方法(JSONObject和JSONArray的静态方法也是来自于JSON),常用的有以下几个API:

public static JSONObject parseObject(String text);

public static JSONObject parseObject(String text, Feature... features);

public static <T> T parseObject(String text, Class<T> clazz);

public static <T> T parseObject(String text, Class<T> clazz, Feature... features);

public static <T> T parseObject(String text, TypeReference<T> type, Feature... features);

public static JSONArray parseArray(String text);

public static <T> List<T> parseArray(String text, Class<T> clazz);

从方法入参就能猜到,fastjson在执行反序列化时的Parse行为由com.alibaba.fastjson.parser.Feature指定。研究parseObject的源码后,发现底层最终都是使用的以下方法:

public static <T> T parseObject(String input, Type clazz, ParserConfig config, ParseProcess processor, int featureValues, Feature... features) {
        if (input == null) {
            return null;
        }

        // featureValues作为基准解析特性开关值
        // 入参features和featureValues取并集得到最终的解析特性
        if (features != null) {
            for (Feature feature : features) {
                featureValues |= feature.mask;
            }
        }

        DefaultJSONParser parser = new DefaultJSONParser(input, config, featureValues);

        if (processor != null) {
            if (processor instanceof ExtraTypeProvider) {
                parser.getExtraTypeProviders().add((ExtraTypeProvider) processor);
            }

            if (processor instanceof ExtraProcessor) {
                parser.getExtraProcessors().add((ExtraProcessor) processor);
            }

            if (processor instanceof FieldTypeResolver) {
                parser.setFieldTypeResolver((FieldTypeResolver) processor);
            }
        }

        T value = (T) parser.parseObject(clazz, null);

        parser.handleResovleTask(value);

        parser.close();

        return (T) value;
    }

通过IDE搜索usage后,发现当没有作为基准解析特性开关的featureValues入参时,都是使用的DEFAULT_PARSE_FEATURE作为基准解析特性开关,以下是JSON.DEFAULT_PARSE_FEATURE的实例化代码:

static {
        int features = 0;
        features |= Feature.AutoCloseSource.getMask();
        features |= Feature.InternFieldNames.getMask();
        features |= Feature.UseBigDecimal.getMask();
        features |= Feature.AllowUnQuotedFieldNames.getMask();
        features |= Feature.AllowSingleQuotes.getMask();
        features |= Feature.AllowArbitraryCommas.getMask();
        features |= Feature.SortFeidFastMatch.getMask();
        features |= Feature.IgnoreNotMatch.getMask();
        DEFAULT_PARSER_FEATURE = features;
}

fastjson还会从环境变量中读取配置来修改DEFAULT_PARSER_FEATURE(虽然很少会有人这么做),但最好还是通过实际运行一下程序来确认你的环境中的实际解析特性开关。

@Test
public void printFastJsonDefaultParserFeature() {
    for (Feature feature : Feature.values()) {
        if (Feature.isEnabled(JSON.DEFAULT_PARSER_FEATURE, feature)) {
            System.out.println(feature);
        }
    }
}

fastjson 和 jackson的反序列化特性对照表

反序列化fastjson和jackson的特性TestCase见DeserializationUseJacksonReplaceFastJsonTest.java

Serialization

fastjson将Java Bean序列化成json字符串通常也是使用com.alibaba.fastjson.JSON的静态方法(JSONObject和JSONArray的静态方法也是来自于JSON),常用的有以下几个API:

public static String toJSONString(Object object);

public static String toJSONString(Object object, SerializerFeature... features);

public static String toJSONStringWithDateFormat(Object object, String dateFormat, SerializerFeature... features);

public static String toJSONString(Object object, boolean prettyFormat);

public static void writeJSONString(Writer writer, Object object, SerializerFeature... features);

从方法入参也能看出,在序列化时,fastjson的特性由SerializerFeature控制,研究toJSONString的源码后,发现最终都会调用以下方法:

public static String toJSONString(Object object, SerializeConfig config, SerializeFilter[] filters, String dateFormat, int defaultFeatures, SerializerFeature... features) {
         SerializeWriter out = new SerializeWriter(null, defaultFeatures, features);
 
         try {
             JSONSerializer serializer = new JSONSerializer(out, config);
             
             if (dateFormat != null && dateFormat.length() != 0) {
                 serializer.setDateFormat(dateFormat);
                 serializer.config(SerializerFeature.WriteDateUseDateFormat, true);
             }
 
             if (filters != null) {
                 for (SerializeFilter filter : filters) {
                     serializer.addFilter(filter);
                 }
             }
 
             serializer.write(object);
 
             return out.toString();
         } finally {
             out.close();
         }
     }

通过IDE搜索usage后,发现当没有作为基准解析特性开关的defaultFeatures入参时,都是使用的DEFAULT_GENERATE_FEATURE作为基准解析特性开关,以下是JSON.DEFAULT_GENERATE_FEATURE的实例化代码:

static {
        int features = 0;
        features |= SerializerFeature.QuoteFieldNames.getMask();
        features |= SerializerFeature.SkipTransientField.getMask();
        features |= SerializerFeature.WriteEnumUsingName.getMask();
        features |= SerializerFeature.SortField.getMask();

        DEFAULT_GENERATE_FEATURE = features;

        config(IOUtils.DEFAULT_PROPERTIES);
    }

fastjson还会从环境变量中读取配置来修改DEFAULT_GENERATE_FEATURE(虽然很少会有人这么做),但最好还是通过实际运行一下程序来确认你的环境中的实际解析特性开关。

@Test
public void printFastJsonDefaultGenerateFeature() {
    for (SerializerFeature feature : SerializerFeature.values()) {
        if (SerializerFeature.isEnabled(JSON.DEFAULT_GENERATE_FEATURE, feature)) {
            System.out.println(feature);
        }
    }
}

fastjson 和 jackson的序列化特性对照表

序列化fastjson和jackson的特性TestCase见SerializationUseJacksonReplaceFastJsonTest.java

Annotation

fastjsonzhu相对于jackson来说注解的功能划分的并没有那么细,因此fastjson的一个注解可能等价于jackson多个注解的组合。

@JSONPOJOBuilder

指定反序列化时创建java对象使用的build方法,对应jackson的@JsonPOJOBuilder。

@JSONCreator

指定反序列化时创建java对象使用的构造方法,对应jackson的@JsonCreator。

@JSONField

指定序列化和反序列化field时的行为。反序列化时,等价于@JsonProperty + @JsonDeserialize + @JsonUnwrapped + @JsonFormat+ @JsonAlias;

序列化时,等价于@JsonProperty + @JsonSerialize + @JsonUnwrapped + @JsonFormat + @JsonRawValue + @JsonView。

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER })
public @interface JSONField {
    // 序列化和反序列化时的字段顺序,等价于jackson的@JsonProperty.index()
    int ordinal() default 0;

    // 序列化和反序列化时的字段名称映射,等价于jackson的@JsonProperty.value()
    String name() default "";

    // 序列化和反序列化时的数据格式(日期格式、16进制等等),等价于jackson的@JsonFormat.shape() + @JsonFormat.pattern()
    String format() default "";

    // 字段是否序列化,等价于jackson的@JsonProperty.access()
    boolean serialize() default true;

    // 字段是否反序列化,等价于jackson的@JsonProperty.access()
    boolean deserialize() default true;

    // 序列化特性,等价于jackson的@JsonProperty.with()
    SerializerFeature[] serialzeFeatures() default {};

    // 反序列化特性,等价于jackson的@JsonFormat.with()
    Feature[] parseFeatures() default {};
    
    // 对属性进行打标,便于在序列化时进行exclude或include,等价于jackson的@JsonView
    String label() default "";
    
    // 序列化时将字段内容直接输出,不经过转义,等价于jackson的@JsonRawValue
    boolean jsonDirect() default false;
    
    // 指定序列化时使用的Serializer Class,等价于jackson的@JsonSerialize
    Class<?> serializeUsing() default Void.class;
    
    // 指定反序列化时使用的Deserializer Class,等价于jackson的@JsonDeserialize
    Class<?> deserializeUsing() default Void.class;

    // 指定反序列化时使用的字段别名,等价于jackson的@JsonAlias
    String[] alternateNames() default {};

    // 将字段的子属性映射到父节点上,等价于jackson的@JsonUnwrapped
    boolean unwrapped() default false;
    
    // 指定序列化时字段为null时使用的默认值,等价于jackson的@JsonProperty.defaultValue()
    String defaultValue() default "";
}

unwrapped的用法可以参考AnnotationUseJacksonReplaceFastJsonTest.java中的testJSONFieldUnwrapped。

@JSONType

指定序列化和反序列化一个Java Bean时的行为。

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE })
public @interface JSONType {

    // 是否使用asm优化,jackson无对应特性
    boolean asm() default true;

    // 序列化和反序列化时的field排序,等价于jackson的@JsonPropertyOrder.value()
    String[] orders() default {};

    // 序列化和反序列化时包含的field,等价于jackson的
    String[] includes() default {};

    // 序列化和反序列化时忽略的field,等价于jackson的@JsonIgnoreProperties
    String[] ignores() default {};

    // 序列化特性,等价于jackson的@JsonProperty.with()
    SerializerFeature[] serialzeFeatures() default {};
    
    // 反序列化特性,等价于jackson的@JsonFormat.with()
    Feature[] parseFeatures() default {};
    
    // 序列化时是否依据field字母顺序排序,等价于jackson的@JsonPropertyOrder.alphabetic()
    boolean alphabetic() default true;
    
    // 反序列化多态类型时,如果根据其他typeName等方式无法找到正确的子类时,默认使用的子类,等价于jackson的@JsonTypeInfo.defaultImpl()
    Class<?> mappingTo() default Void.class;
    
    // 反序列化时指定java bean builder类(必须是@JSONPOJOBuilder注解的类),等价于jackson的@JsonDeserialize.builder()
    Class<?> builder() default Void.class;
    
    // 声明这个类型的别名,反序列化多态类型时使用,等价于jackson的@JsonTypeName
    String typeName() default "";

    // 反序列化某个接口或抽象类或父类的子类时指定根据哪个字段的值和子类的typeName相等来决定具体实现类,等价于jackson的@JsonTypeInfo.use() = Id.CUSTOM + @JsonTypeInfo.property()
    String typeKey() default "";
    
    // 反序列化某个接口或抽象类或父类的子类时指定可以反序列化的子类类型,等价于jackson的@JsonSubTypes
    Class<?>[] seeAlso() default{};
    
    // 指定序列化时使用的Serializer Class,等价于jackson的@JsonSerialize
    Class<?> serializer() default Void.class;
    
    // 指定反序列化时使用的Deserializer Class,等价于jackson的@JsonDeserialize
    Class<?> deserializer() default Void.class;

    // 序列化时,如果filed是枚举类型,则和普通的java bean一样输出枚举的filed,而不是通常使用的Enum.name()值,jackson没有对应特性
    boolean serializeEnumAsJavaBean() default false;

    // 指定json和Java bean之间的字段名称映射策略,等价于jackson的@JsonNaming
    PropertyNamingStrategy naming() default PropertyNamingStrategy.CamelCase;

    // 指定序列化时使用的Serialize filter,等价于jackson的@JsonFilter
    Class<? extends SerializeFilter>[] serialzeFilters() default {};
}

JSONObject & JSONArray

首先来看看fastjon中JSONObject和JSONArray的源码:

public class JSONObject extends JSON implements Map<String, Object>, Cloneable, Serializable, InvocationHandler {

    private final Map<String, Object> map;
    ...
}
public class JSONArray extends JSON implements List<Object>, Cloneable, RandomAccess, Serializable {

    private static final long  serialVersionUID = 1L;
    private final List<Object> list;
    protected transient Object relatedArray;
    protected transient Type   componentType;
    ...
}

从源码就可以发现,JSONObject实际是一个Map<String, Object>,而JSONArray实际是一个List<JSONObject>。因此可以将JSONObject类型改为Map<String, Object>,而JSONArray类型改为List<Object>。
但是这种方式就会导致上层API出现大量修改,因为缺少了JSONObject和JSONArray提供的多种便利的类型转换方法。如果想要暂时保留JSONObject和JSONArray,此时可以采取一种取巧的方法。

暂时保留JSONObject & JSONArray的过渡方法#

jackson官方提供了对org.json库的数据类型支持jackson-datatype-json-org,因此可以将com.alibaba.fastjson.JSONObject替换为org.json.JSONObject,
com.alibaba.fastjson.JSONArray替换为org.json.JSONArray,这两个类库的对象API大致相同,当然一些细小的改动还是避免不了的。
如果想完全不改上层代码,那也可以参考jackson-datatype-json-org和
jackson-datatype-json-lib自己实现jackson对fastjson的数据类型的binder。

larva-zhang/jackson-datatype-fastjson欢迎大家使用或提issues。

https://github.com/larva-zhang/jackson-datatype-fastjson

JSONPath#

使用json-path/JsonPath就能轻松替换fastjson的JSONPath,而且功能比fastjson更强大。

只需参考JsonProvider SPI使用JacksonJsonProvider替代json-path/JsonPath默认的JsonSmartJsonProvider即可。

自定义扩展

自定义Deserializer

fastjson中实现自定义Deserializer的方法通常是实现ObjectDeserializer接口的deserialze方法

<T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName);

在jackson中实现自定义Serializer的方法则通常是继承StdDeserializer抽象类,重写deserialize方法

public abstract T deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException;

自定义Serializer

fastjson中实现自定义Serializer的方法通常是实现ObjectSerializer接口的write方法

void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException;

在jackson中实现自定义Serializer的方法则通常是继承StdSerializer抽象类,重写serialize方法

public abstract void serialize(T value, JsonGenerator gen, SerializerProvider serializers) throws IOException;

自定义Serialize Filter

fastjson中提供了6种SerializeFilter,详见fastjson/wiki/SerializeFilter。
而在jackson中则是建议继承SimpleBeanPropertyFilter。

https://github.com/alibaba/fastjson/wiki/SerializeFilter

参考文档

  • alibaba/fastjson

  • FasterXML/jackson

  • Jackson快速替换Fastjson之道

  • fastjson Features 说明

  • fastjson SerializerFeatures 说明

  • fastjson JSONField 说明

  • Jackson – Decide What Fields Get Serialized/Deserialize

记一次fastjson转jackson的生产事故 之前暴露出fastjson存在漏洞,虽然后期fastjson团队对于相关漏洞有修复,但是为了确保服务和数据的安全性,公司还是决定所有项目弃用fastjson,改用jackson。因为之前项目很多地方都运用了fastjson,改起来算是一个大工程了,有些地方没注意可能就会导致出错,这不,在换了以后的确遇到了问题。 客户需要下单,棘突逻辑我就不讲了,里面有一个json字符串转对象的操作,然后获取对象中的data属性用于后续操作。用过fastjson的伙伴都知道可以使用JSON.parseObject(Strin 阅读详情

相关推荐

2步jackson快速替换fastjson

2步jackson快速替换fastjson 因为fastjson的安全漏洞,项目需求需要全面替换fastjson,所以写了这个jar包,jackson快速替换Fastjson 第一步,添加依赖 <dependency> <groupId>com.github.zjb-it</groupId> <artifactId>jackson-replace-fastjson</artifactId>

weixin_43455403的博客 2384

Jackson无缝替换Fastjson

一般默认的转换器不能满足我们的需求,需要自定义消息转换器,可以创建自己的转换器类(Fastjson,Jackson消息转换器),并在 Spring Boot 配置中进行注册。通常情况下,只需要注册您的自定义转换器,Spring Boot 将自动将其应用于适当的请求和响应。@Override//使用fastjson converter@Bean// 通过该方法对mapper对象进行设置,所有序列化的对象都将按改规则进行序列化。

Edward_hjh的博客 1999

Fastjson迁移Jackson实战:安全、稳定与工程实践深度解析

JSON序列化与反序列化是Java后端开发中的基础技术,其核心原理是将内存中的对象转换为可传输或存储的文本格式,反之亦然。这项技术的价值在于实现跨平台、跨语言的数据交换,是现代分布式系统和微服务架构的通信基石。在工程实践中,JSON库的选择直接影响着系统的安全性、稳定性和可维护性。例如,Fastjson因其历史安全漏洞和宽松的默认行为,可能在长期维护中引入不确定性风险。相比之下,Jackson以其严格的设计哲学和与Spring生态的深度集成,为构建健壮的企业级应用提供了更可靠的保障。本文聚焦于从Fastjs

weixin_34221036的博客 418

Java JSON序列化库迁移实战:从Fastjson到Jackson的完整指南

JSON序列化是Java后端开发中的基础技术,它实现了对象与JSON格式数据的相互转换。其核心原理是通过反射或字节码技术,将Java对象的属性映射为JSON键值对。在微服务架构和API开发中,高效的JSON处理直接影响系统性能和稳定性。Jackson作为Spring生态默认的JSON处理器,提供了严谨的类型安全机制、丰富的注解支持和可预测的性能表现。相比之下,Fastjson虽然在某些场景下速度突出,但其默认的宽松解析策略和AutoType特性可能带来安全隐患与性能波动。本文基于实际迁移经验,深入探讨了如何

weixin_33951761的博客 318

Java序列化安全深度解析:从原生漏洞到Jackson/Protobuf实战方案

序列化作为数据持久化与网络传输的基础技术,其核心原理是将对象状态转换为可存储或传输的格式。Java原生序列化机制因设计缺陷,在反序列化过程中会**自动调用对象的`readObject()`方法**,这构成了严重的安全隐患,攻击者可利用此特性构造恶意字节流执行任意代码。从技术价值看,安全的序列化方案能保障数据完整性、防止信息泄露,并提升系统稳定性。在应用场景上,JSON(特别是Jackson)因其显式映射特性成为Web API和微服务通信的首选,而Protocol Buffers则凭借高性能与强契约适用于RP

weixin_33924770的博客 456

Fastjson安全模式深度解析:从AutoType漏洞到SafeMode实战配置

JSON反序列化是现代Java应用开发中的核心技术,它实现了数据格式与Java对象之间的高效转换。其核心原理是通过解析JSON字符串中的类型信息,动态创建并填充对应的Java对象实例。然而,这一机制的灵活性也带来了安全风险,攻击者可能通过精心构造的JSON数据触发恶意代码执行,即远程代码执行(RCE)漏洞。Fastjson作为高性能JSON库,其AutoType特性正是此类漏洞的常见根源。为了从根本上解决这一问题,Fastjson引入了安全模式(SafeMode),通过默认禁止不可信的AutoType行为,

weixin_34414196的博客 375

JsonExp!fastjson漏洞批量检测工具

若出现dnslog回弹,可根据前面的编号去寻找对应的payload自1.4.0版本起,编号由7-9位的随机数字+字母组成编号.地址随机地址自1.4.0版本新增功能,参考自pocsuite3需挂全局代理才能访问并申请资源,使用此功能将对发包速度产生较大影响。若存在dnslog回弹结果,将会生成/result/xxx_dnslog.html文件,没触发dnslog则不会生成该文件。LDAP检测若为内网环境/目标无法DNS解析时,可使用工具在本地/云服务器起一个LDAP服务。

leah126的博客 1724

泛微Ecology9单点登录实战指南:从Token获取到页面跳转

本文提供了一份详尽的泛微Ecology9单点登录实战指南,重点解析了Token跳转式SSO的核心流程。内容涵盖从理解关键参数(如appid、loginid)与一次性Token机制,到通过代码示例演示如何正确调用接口获取Token,并详细说明了拼接不同场景跳转地址的完整规则与安全实践,旨在帮助开发者高效、稳定地实现业务系统与OA门户的无缝集成。

ol789012345的博客 1075

Android关于json数据的处理JSONObject、Gson、FastJson、Jackson

当我刚接触Android的时候,还很稚嫩,社交经验也几乎为零,还是前辈们说啥我干啥,所以跟着前辈们用JSONObject。想必有一些后起之秀应该都没用过,因为大部分都是沉浸在使用第三方无法自拔,的确第三方极大的减少我们的开发时间,也省去改bug的时间。但是倔强的我个人还是认为,会创造比会用更好,当然我也是个菜鸟创造不出什么花儿来,但我的项目坚持能不用第三方就不用,这是题外话,哈哈。 转载注明出处,...

阿拙茶茶的博客 406

Python量化投资入门教程:从零构建你的第一个交易策略

量化投资教程以数学模型和计算机程序实现超额收益,选用Python工具链完成数据获取、策略构建及回测。通过移动平均线交叉策略示例,展示数据预处理、信号生成、收益计算及可视化全流程,结合收益率、最大回撤和夏普比率评估策略,并建议参数优化与策略融合提升稳健性。

ylmx5201314的博客 2458

行政数据分析大屏实战:用Tableau从Excel到看板的完整搭建流程(含数据连接与字段计算避坑)

本文详细介绍了如何利用Tableau从Excel数据源搭建行政数据分析大屏的完整流程,涵盖数据准备、连接技巧、计算字段优化、看板设计及动态交互部署。通过五阶工作流,帮助用户高效处理多源异构数据,实现业务洞察与可视化呈现,提升行政数据分析效率。

weixin_29696711的博客 342

Java JSONObject核心解析:Fastjson、Jackson与Gson选型、API实战与避坑指南

在数据交换领域,JSON作为一种轻量级的数据格式,已成为现代应用开发中结构化数据传输与存储的通用标准。其核心原理是基于文本的键值对集合,具有良好的可读性和跨语言兼容性。在Java生态中,JSONObject作为JSON的对象模型映射工具,其技术价值在于将字符串形式的JSON数据转化为内存中可编程操作的对象,极大地简化了数据解析、构建和序列化的过程,提升了开发效率和代码健壮性。在实际工程实践中,开发者需要根据性能、安全性和API设计等维度,在主流库如Fastjson、Jackson和Gson之间做出合理选型。

weixin_31236101的博客 320

高通Camera PDAF调试实战:从Type2到Type3的避坑指南与Log分析技巧

本文深入解析高通Camera平台PDAF调试实战,重点对比Type2与Type3的核心差异,提供详细的配置迁移方案和Log分析技巧。针对常见兼容性问题如对焦速度变慢、低光失效等,给出具体解决方案,并分享性能优化案例与高级调试工具链,帮助开发者快速提升PDAF调试效率。

weixin_29164185的博客 413

Spring Boot项目从Fastjson1升级到Fastjson2实战指南

JSON序列化与反序列化是Java后端开发中处理网络通信和数据交换的基础技术,其核心原理是将内存中的对象结构转换为可传输或存储的字符串格式,反之亦然。这项技术的价值在于实现跨平台、跨语言的数据交互,是构建现代分布式系统和微服务架构的基石。在Java生态中,Fastjson因其高性能和易用性曾被广泛采用,但其1.x版本因AutoType机制引发的安全漏洞问题频发,例如1.2.84等版本虽经修复,但安全风险依然存在。因此,将项目升级至经过彻底重构、默认关闭AutoType且性能更优的Fastjson2,对于提升

weixin_30596735的博客 496

学习 Bootstrap 5 之 Tables

学习 Bootstrap 5 之 表格表格 (Tables)1. 创建表格(1). 使用原生的表格标签(2). 使用Bootstrap 5 的提供的表格标签类(3). 原生与Bootstrap创建出来的表格的对比2. 表格样式(1). 表格样式的效果(2). 表格样式的使用1). 用于 <table> 标签2). 用于 <thead> <tbody> <tfoot> 标签 表格 (Tables) 1. 创建表格 (1). 使用原生的表格标签 <tabl

qq_37354060的博客 2130

3. Matérn协方差模型与随机偏微分方程

对应的高斯马尔可夫随机场 (GMRF)可以通过使用某种随机偏微分方程(SPDE)明确构造,当由高斯白噪声驱动时,随机偏微分方程的解是具有 Matérn 协方差函数的高斯场(GF)

weixin_40614311的博客 1748

fastjson安全模式异常解析:从autoType漏洞到安全反序列化实践

JSON反序列化是现代Web服务数据交换的核心技术,它允许将JSON字符串转换为编程语言中的对象。其原理是通过解析JSON结构,映射到目标对象的属性。这项技术的价值在于简化了前后端及服务间的数据通信,但不当使用会引入严重安全风险,例如远程代码执行漏洞。在Java生态中,fastjson库因其性能优势被广泛使用,但其autoType特性曾因安全漏洞备受关注。为此,fastjson引入了safeMode安全模式,通过完全禁用autoType来加固安全。本文聚焦于当safeMode开启时,处理遗留系统或缓存中带@

weixin_34279184的博客 341

【100%通过率】华为OD机试真题 Python 实现【最多组合直角三角形个数】【2023 Q1 | 100分】

有N条线段,长度分别为a[1]-a[n]。 现要求你计算这N条线段最多可以组合成几个直角三角形。 每条线段只能使用一次,每个三角形包含三条线段。

MISAYAONE的博客 1万+

反序列化漏洞原理与防御:从Java CC链到Fastjson的实战解析

序列化与反序列化是计算机科学中实现对象持久化与网络传输的核心机制,其本质是将内存中的复杂数据结构转换为可存储或传输的线性格式(如字节流、JSON),并在需要时重建为原始对象。这一过程依赖于对象的类定义,若反序列化器不加验证地执行不可信数据中的指令,便会模糊数据与代码的边界,导致程序执行攻击者控制的任意代码,从而引发严重的安全风险。其技术价值在于高效的数据交换,但错误实现会带来远程代码执行、权限提升等严重后果,广泛应用于RPC通信、Session存储、缓存系统等场景。本文聚焦于反序列化漏洞这一“定时炸弹”,深

weixin_33991418的博客 326

2026基金本子新规必看!聚焦四大底层问题,利用AI辅助分别破解提升中标率

我拟申报的研究主题为【明确的研究主题或关键词组合】。选题方向也是评审专家关注的核心之一,申报前可以检索近五年领域前人中标项目,分析现有研究的空白与不足,并结合自身研究基础选择 “人无我有、人有我优” 的细分方向,如果是交叉学科选题,则要阐述不同学科的融合逻辑与创新点。“推动国家战略”、“带来行业发展”等宏观表述,有很多同仁都喜欢用这类话术开篇,但实际上宏大叙事无法替代具体的真实科学问题,明确不了研究要解决的核心痛点,更没有说明问题的现实针对性,评审看了往往抓不到研究的核心价值。

智能AI让学术科研更容易 295

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

上一篇: 简历上的“熟练掌握 RPC”,到底是个什么水平?
下一篇: IDEA 2021.1 的 Win 和 Mac 快捷键大全!!
Java思维导图
博客等级 码龄10年 306粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值