Java JSON转换实战:安全选型、三大场景解析与性能优化
1. JSON转换从新手到老手的必经之路如果你写过Java那你一定处理过JSON。这玩意儿就像程序员世界里的“普通话”前后端沟通、系统间数据交换、配置文件存储几乎无处不在。但就是这个看似简单的数据格式在实际操作中尤其是各种转换场景下总能冒出一些让人挠头的问题为什么我的JSON字符串转成List就报错明明字段都对得上反序列化成对象怎么就有几个字段是null用JSONObject取数据时一不小心就是个NullPointerException。更别提网上各种关于fastjson漏洞的新闻让人用起来心里直打鼓。我处理过太多因为JSON转换不当引发的线上bug从数据错乱到接口超时甚至安全漏洞。今天我就把JSON转换里最常见的三种场景——转List、转对象、转JSONObject——掰开了揉碎了讲清楚。这不是一份简单的API文档罗列而是融合了多年踩坑经验、性能考量和安全实践的实战指南。无论你是刚入门的新手还是想梳理知识体系的老手都能从这里找到“原来如此”的收获。2. 核心工具选型与安全第一原则在动手写代码之前选对工具是成功的一半。Java生态里处理JSON的库很多但最绕不开的就是阿里巴巴的fastjson。它快API设计得对开发者也很友好一度成为国内Java开发者的首选。但是它的“黑历史”也让很多人望而却步。所以我们先得把工具和安全的事儿说透。2.1 主流JSON库的“三国演义”目前Java领域主流的JSON库有三个fastjson、Jackson和Gson。它们各有各的脾气。fastjson最大的特点就是快序列化/反序列化速度在多数场景下领先。它的API非常简洁比如JSON.parseObject()、JSON.toJSONString()几乎成了条件反射。但它的“罪状”也很明显历史漏洞多尤其是反序列化漏洞曾经让不少企业深夜应急默认开启AutoType特性允许在JSON中指定任意类型进行反序列化是安全问题的根源文档和社区响应有时不尽如人意。JacksonSpring Boot的默认集成库可以说是企业级应用的事实标准。它的特点是功能全面、稳定、社区活跃。性能与fastjson互有胜负但差距不大。它的API相对更“学院派”一点需要稍微多写几行代码但换来的是极高的可定制性和安全性。GsonGoogle出品以简单易用著称。它的API设计非常直观对于简单的POJO转换非常友好。但在处理复杂类型如泛型、混合类型时配置起来可能会比Jackson麻烦一些。性能通常稍逊于前两者但对于绝大多数应用来说完全足够。注意选择哪一个往往不是单纯的技术决策。如果你的项目是全新的我强烈建议使用Jackson省心、安全、生态好。如果老项目大量使用了fastjson全面迁移成本高那么需要做的不是逃避而是把它“锁进笼子”里安全地使用。2.2 与fastjson漏洞共存的“安全守则”鉴于fastjson的广泛存在完全弃用不现实。如果你必须使用它请务必遵守以下安全铁律这能帮你挡住99%的潜在风险立即升级到安全版本永远使用官方发布的最新稳定版。截至我写这篇文章时fastjson的最新安全版本是1.2.83或更高请务必在启动前检查官网或Maven中央库确认。老版本特别是1.2.48及以前的版本存在已知的高危漏洞必须升级。关闭AutoType这是最重要的安全配置。在你的应用启动时比如在main方法或PostConstruct初始化块中务必显式关闭它。ParserConfig.getGlobalInstance().setAutoTypeSupport(false); // 更进一步设置安全模式只允许反序列化白名单中的类 ParserConfig.getGlobalInstance().addAccept(com.yourcompany.yourproject.);使用SafeMode如果版本支持在1.2.68及以上版本可以开启安全模式从根本上禁止AutoType。ParserConfig.getGlobalInstance().setSafeMode(true);谨慎处理未知来源的JSON永远不要用fastjson去解析来自用户输入、外部未经验证接口的JSON字符串。如果必须解析要先进行严格的格式和内容校验。在接下来的所有示例中我会主要以fastjson安全配置后和Jackson进行对比演示因为这两者的使用频率最高。Gson的API类似你可以触类旁通。3. 场景一JSON字符串转Java List这是最常见的需求之一比如后端接口返回了一个商品列表的JSON我们需要把它转换成ListProduct来操作。这里面的坑主要集中在泛型擦除和复杂结构上。3.1 基础转换与泛型处理假设我们有一个简单的User类和一段JSON数组字符串。// User.java public class User { private String name; private Integer age; // 省略 getter/setter 和构造函数 }// JSON 字符串 String jsonArrayStr [{\name\:\张三\,\age\:25}, {\name\:\李四\,\age\:30}];使用fastjson转换fastjson通过TypeReference来解决泛型擦除问题这是最标准的方式。import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import java.util.List; ListUser userList JSON.parseObject(jsonArrayStr, new TypeReferenceListUser() {}); System.out.println(userList.get(0).getName()); // 输出张三这里的new TypeReferenceListUser() {}创建了一个匿名子类在运行时保留了泛型信息ListUser告诉fastjson到底要转换成什么类型。使用Jackson转换Jackson需要用到ObjectMapper和TypeReference。import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; ObjectMapper mapper new ObjectMapper(); ListUser userList mapper.readValue(jsonArrayStr, new TypeReferenceListUser() {});实操心得无论用哪个库TypeReference都是处理泛型集合转换的“标准答案”。不要尝试用List.class作为参数那样只会得到一个包含Map的List而不是你期望的ListUser。3.2 处理复杂嵌套与ListMap现实中的数据往往更复杂。比如你拿到的是一个不确定结构的JSON数组或者你需要先以ListMapString, Object的形式进行中间处理。场景JSON数组转ListMapString complexJson [{\id\:1, \attr\:{\color\:\red\}}, {\id\:2}]; // fastjson ListMapString, Object mapList JSON.parseObject(complexJson, new TypeReferenceListMapString, Object() {}); String color (String) ((Map)mapList.get(0).get(attr)).get(color); // 需要强制转换繁琐且易错 // jackson ListMapString, Object mapList mapper.readValue(complexJson, new TypeReferenceListMapString, Object() {});这种方式的缺点是你需要手动进行类型判断和转换代码不优雅且容易出错。更好的方式是明确定义对应的Java类。场景嵌套对象的List如果JSON是对象中包含列表呢{ status: success, data: [ {name: 张三, age: 25}, {name: 李四, age: 30} ] }你需要定义一个包装类public class ApiResponseT { private String status; private T data; // 这里T可以是ListUser // getter/setter }然后分两步或一步转换// 一步到位推荐 ApiResponseListUser response JSON.parseObject(jsonStr, new TypeReferenceApiResponseListUser() {}); // 或者先转成ApiResponseObject再处理data不推荐失去类型安全3.3 常见问题与排查技巧实录问题1转换成功但List里的对象所有字段都是null。排查99%的原因是JSON字符串中的字段名和Java实体类的属性名对不上。比如JSON里是user_nameJava字段是userName。解决fastjson在字段上使用JSONField(name user_name)注解。Jackson使用JsonProperty(user_name)注解。通用配置解析器支持驼峰命名自动映射fastjson的FeatureJackson的PropertyNamingStrategy。问题2报错com.alibaba.fastjson.JSONException: syntax error, pos 1。排查JSON字符串格式错误。可能是字符串开头结尾有不可见字符如BOM头或者根本不是有效的JSON。在线上经常是因为接口返回了HTML错误页面而非JSON。解决jsonStr jsonStr.trim(); // 先trim // 使用在线JSON校验工具或IDE插件验证字符串格式 // 对于网络请求务必检查HTTP响应状态码和Content-Type是否为application/json问题3转换ListLong时数字被识别成了Integer导致ClassCastException。排查JSON中的数字没有小数点解析器默认可能当作Integer处理但你的泛型是Long。解决使用TypeReference明确指定类型是ListLong解析器会做内部转换。对于fastjson也可以使用parseArray并指定类型ListLong idList JSON.parseArray([1,2,3], Long.class);问题4性能问题。当List非常大超过10万条时一次性转换内存溢出OOM。排查JSON.parseObject或mapper.readValue()会一次性将整个JSON数组加载到内存中并生成完整的Java对象集合。解决使用流式解析Streaming API。Jackson的JsonParser是这方面的佼佼者。ObjectMapper mapper new ObjectMapper(); try (JsonParser parser mapper.getFactory().createParser(new File(huge.json))) { if (parser.nextToken() ! JsonToken.START_ARRAY) { throw new IllegalStateException(Expected an array); } while (parser.nextToken() ! JsonToken.END_ARRAY) { User user mapper.readValue(parser, User.class); // 处理单个user对象比如存入数据库处理完即可被GC回收 processUser(user); } }这种方式像“流水线”一样处理数据内存中始终只持有一个或少量对象非常适合处理大文件或网络流。4. 场景二JSON字符串转Java对象POJO将JSON转换成定义好的Java对象POJO是序列化/反序列化的核心。这里的挑战在于映射的准确性和对复杂数据结构的支持。4.1 基础映射与注解使用基础的转换很简单但要做到精准映射必须善用注解。// 基础转换 String jsonStr {\name\:\王五\,\age\:28, \email\:\wangwuexample.com\}; // fastjson User user JSON.parseObject(jsonStr, User.class); // jackson User user mapper.readValue(jsonStr, User.class);常用注解详解字段名映射解决JSON键名与Java字段名不一致的问题。public class User { JSONField(name user_name) // fastjson JsonProperty(user_name) // jackson private String userName; }忽略字段Java中有但JSON中不需要的字段或者反之。public class User { JSONField(serialize false) // fastjson: 序列化时忽略 JsonIgnore // jackson: 始终忽略 private String password; JSONField(deserialize false) // fastjson: 反序列化时忽略 // jackson: 用JsonIgnoreProperties(ignoreUnknown true)在类级别忽略未知字段 }日期格式化这是最容易出问题的地方之一。public class Order { JSONField(format yyyy-MM-dd HH:mm:ss) // fastjson JsonFormat(pattern yyyy-MM-dd HH:mm:ss, timezone GMT8) // jackson private Date createTime; }重要提示Jackson的JsonFormat一定要指定timezone时区否则在不同环境的服务器上转换出来的时间可能和你预期相差8小时中国时区问题。4.2 处理多态类型与复杂对象当JSON中的一个字段根据某个条件可能是不同的子类对象时就需要多态处理。场景一个图形Shape数组包含Circle和Rectangle。[ {type: circle, radius: 5}, {type: rectangle, width: 10, height: 20} ]Jackson的解决方案非常强大和清晰使用JsonTypeInfo和JsonSubTypes注解。JsonTypeInfo(use JsonTypeInfo.Id.NAME, property type) // 使用JSON中的type字段来识别类型 JsonSubTypes({ JsonSubTypes.Type(value Circle.class, name circle), JsonSubTypes.Type(value Rectangle.class, name rectangle) }) public abstract class Shape { private String type; } public class Circle extends Shape { private double radius; } public class Rectangle extends Shape { private double width; private double height; } // 反序列化时Jackson能自动识别并创建正确的子类对象 String shapesJson ...; ListShape shapes mapper.readValue(shapesJson, new TypeReferenceListShape() {});fastjson的解决方案使用JSONType注解和parseObject时指定ParserConfig。JSONType(typeName circle, seeAlso Rectangle.class) // seeAlso在fastjson 1.2.71支持 public class Circle extends Shape { ... } // 反序列化前需要注册子类型 ParserConfig.getGlobalInstance().registerSubType(Circle.class, circle); ParserConfig.getGlobalInstance().registerSubType(Rectangle.class, rectangle); ListShape shapes JSON.parseObject(shapesJson, new TypeReferenceListShape() {});相比之下Jackson的多态支持在注解的易用性和功能完整性上更胜一筹。4.3 自定义序列化/反序列化器有些时候默认的转换规则无法满足需求。比如你想把数据库里存储的1/0转换成true/false或者把一个复杂的对象压缩成一个字符串存储。以Jackson为例自定义一个将LocalDateTime序列化为时间戳的反序列化器public class TimestampDeserializer extends JsonDeserializerLocalDateTime { Override public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { long timestamp p.getLongValue(); // 从JSON中读取long型时间戳 return LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneId.systemDefault()); } } // 在实体类字段上使用 public class Event { JsonDeserialize(using TimestampDeserializer.class) private LocalDateTime eventTime; }fastjson也支持通过实现ObjectDeserializer接口来自定义但Jackson的模块化设计让这种扩展更加规范和强大。5. 场景三JSON字符串转JSONObject动态解析不是所有JSON结构都对应着预先定义好的Java类。在面对动态的、结构不固定的JSON时比如处理第三方API的响应或者通用的配置信息我们更需要一个可以灵活操作的结构这就是JSONObject在fastjson中或JsonNode在Jackson中。5.1 灵活操作与路径查询JSONObject本质上是一个MapString, Object可以动态地存取数据。String dynamicJson {\code\:200, \message\:\成功\, \data\:{\total\:100, \items\:[{\id\:1,\name\:\foo\}]}}; // fastjson - 使用JSONObject JSONObject jsonObj JSON.parseObject(dynamicJson); Integer code jsonObj.getInteger(code); // 直接获取基本类型 JSONObject dataObj jsonObj.getJSONObject(data); // 获取嵌套的JSONObject JSONArray itemsArray dataObj.getJSONArray(items); // 获取嵌套的JSONArray String firstName itemsArray.getJSONObject(0).getString(name); // 获取深层属性 // 路径查询fastjson 1.2.0 支持非常方便 String nameViaPath (String) JSONPath.eval(jsonObj, $.data.items[0].name); // jackson - 使用JsonNode JsonNode rootNode mapper.readTree(dynamicJson); int code rootNode.get(code).asInt(); JsonNode dataNode rootNode.path(data); // path方法在字段缺失时返回missing node而非null更安全 JsonNode itemsNode dataNode.get(items); String firstName itemsNode.get(0).get(name).asText();注意事项使用getXXX方法如getInteger,getString时如果键不存在或类型不匹配fastjson的JSONObject会返回null而Jackson的JsonNode的get().asText()在节点为null时会返回null字符串使用asText(null)可以指定默认值。务必做好空值判断这是动态解析中最常见的NullPointerException来源。5.2 类型安全获取与默认值为了避免空指针养成使用安全获取方法的习惯。// fastjson 安全获取示例 String message jsonObj.getString(message); if (message null) { message default message; } // 或者使用getOrDefault (需要先转成Map或者使用JSONObject本身的方法判断) Object value jsonObj.getOrDefault(nonExistKey, default); // jackson 安全获取示例更优雅 String message rootNode.path(message).asText(default message); // 不存在则返回default message int maybeExist rootNode.path(maybeExistInt).asInt(0); // 不存在或不是数字则返回0 boolean isExist rootNode.has(code); // 检查键是否存在5.3 JSONObject与POJO的混合使用在实际项目中纯动态解析和纯静态定义往往混合使用。一种常见的模式是用JSONObject解析外层通用结构再用parseObject将data部分转换成具体的POJO。// 假设API返回格式固定为 {code, message, data} String apiResponse ...; JSONObject respObj JSON.parseObject(apiResponse); int code respObj.getIntValue(code); String msg respObj.getString(message); if (code 200) { // 将data部分转换为具体的业务对象List String dataJson respObj.getJSONObject(data).toJSONString(); // 注意这里多了一次序列化有性能损耗 PageResultUser pageResult JSON.parseObject(dataJson, new TypeReferencePageResultUser() {}); // 更优的做法直接从JSONObject中获取data对应的JSONObject然后操作 JSONObject dataObj respObj.getJSONObject(data); Integer total dataObj.getInteger(total); // 但要将items转成ListUser还是需要借助TypeReference ListUser users dataObj.getObject(items, new TypeReferenceListUser() {}); }这种混合模式兼顾了灵活性和类型安全是处理通用API响应的最佳实践。6. 高级话题与性能深度优化当你的系统处理海量JSON数据或者对响应时间有极致要求时一些高级技巧和性能优化点就必须纳入考量了。6.1 循环引用与$ref问题当两个Java对象相互引用时序列化成JSON会产生循环引用可能导致栈溢出或无限循环。public class Department { private String name; private ListEmployee employees; } public class Employee { private String name; private Department department; // 引用上级部门 }fastjson的解决方案默认开启“循环引用检测”序列化时会用$ref表示重复引用的对象。Employee emp new Employee(); Department dept new Department(); emp.setDepartment(dept); dept.setEmployees(Arrays.asList(emp)); String json JSON.toJSONString(dept); // 输出可能包含 {$ref:$[0].employees[0].department} 这样的引用路径你可以通过SerializerFeature.DisableCircularReferenceDetect关闭此特性但风险是栈溢出。Jackson的解决方案默认抛出JsonMappingException。你需要显式处理ObjectMapper mapper new ObjectMapper(); // 方法1忽略可能导致无限循环不推荐 // mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); // 方法2使用JsonIgnore注解在字段上打断循环 // 方法3使用JsonIdentityInfo注解为对象添加ID JsonIdentityInfo(generator ObjectIdGenerators.PropertyGenerator.class, property id) public class Department { ... }处理循环引用最根本的方法是重新审视你的模型设计避免在序列化场景中出现双向引用或者使用DTOData Transfer Object来裁剪数据只序列化需要的字段。6.2 序列化过滤与定制输出你经常不需要把对象的所有字段都输出成JSON。比如User对象中的password、salt等敏感信息。Jackson提供了非常灵活的过滤机制JsonView定义视图在不同接口返回不同字段。public class Views { public static class Public {} public static class Internal extends Public {} } public class User { JsonView(Views.Public.class) private String username; JsonView(Views.Internal.class) private String email; JsonIgnore private String password; } // 序列化时指定视图 String publicJson mapper.writerWithView(Views.Public.class).writeValueAsString(user);JsonFilter动态过滤。JsonSerializer自定义字段的序列化逻辑。fastjson主要通过JSONField(serialize false)或使用SimplePropertyPreFilter在序列化时动态指定包含或排除的字段。SimplePropertyPreFilter filter new SimplePropertyPreFilter(User.class, username, age); String json JSON.toJSONString(user, filter);6.3 性能压测与选型终极建议纸上得来终觉浅我针对几种常见场景做了简单的性能对比使用JMH微基准测试仅供参考结果趋势如下小对象1KB序列化/反序列化fastjson通常略有优势Jackson紧随其后Gson稍慢。但差距在微秒级对于绝大多数应用可忽略不计。大对象嵌套深、字段多或超大数组Jackson的流式APIJsonParser/JsonGenerator在内存稳定性和吞吐量上表现更优尤其是在需要分批处理的场景。并发场景ObjectMapper和JSON类都是线程安全的但它们的配置对象如ParserConfig可能不是。建议将配置好的实例作为单例复用避免重复创建的开销。终极选型建议新项目、微服务、Spring Boot项目无脑选Jackson。它是Spring生态的原生选择稳定、安全、功能全面社区支持好长期维护有保障。性能完全满足需求。遗留老项目大量使用fastjson不要盲目重构。首先立即升级到最新的安全版本1.2.83。其次全局关闭AutoType并设置安全模式。然后对于新增的模块或重要的核心接口可以逐步引入Jackson。同时使用代码扫描工具如SonarQube检查是否存在不安全的fastjson用法。对Google Gson有偏好或Android开发Gson是一个不错的选择API简单直观。但在处理复杂泛型和多态时可能需要比Jackson更多的自定义代码。一个重要的性能技巧对象复用。无论是fastjson的JSONObject/JSONArray还是Jackson的ObjectMapper在频繁调用的场景下如高频接口都要考虑复用。// 错误示范每次调用都new public User parseUser(String json) { return new ObjectMapper().readValue(json, User.class); // 昂贵 } // 正确示范复用单例 private static final ObjectMapper MAPPER new ObjectMapper(); public User parseUser(String json) { return MAPPER.readValue(json, User.class); } // fastjson的JSON类本身是静态方法内部有缓存机制但TypeReference等也需要考虑复用。7. 实战问题排查清单与调试技巧最后我整理了一份你在处理JSON转换时几乎一定会遇到的错误清单和调试方法。把它贴在你的工位旁边能省下大量搜索时间。问题现象可能原因排查步骤与解决方案转换后对象字段为null1. 字段名不匹配大小写、下划线/驼峰2. 字段没有public的getter/setter方法3. 使用了final修饰符1. 使用注解JSONField/JsonProperty显式映射2. 检查getter/setter方法是否存在且可访问3. 移除final关键字或配置解析器支持如Jackson的ObjectMapper.configure(MapperFeature.ALLOW_FINAL_FIELDS_AS_MUTATORS, true)报错Unrecognized field ...JSON中有Java类不存在的字段1. Jackson在类上添加JsonIgnoreProperties(ignoreUnknown true)2. fastjson使用Feature.IgnoreNotMatch不推荐可能隐藏错误最佳实践建议严格匹配忽略未知字段可能掩盖数据版本不一致的问题。日期转换错误差8小时等时区未正确设置1. Jackson在JsonFormat中明确指定timezone2. 全局配置ObjectMapper.setTimeZone(TimeZone.getTimeZone(GMT8))3. fastjson使用SerializerFeature.WriteDateUseDateFormat并指定格式数字被解析成字符串或反之JSON中数字加了引号或字符串没加引号1. 检查JSON源数据格式是否标准2. 使用asInt()、asText()等安全方法Jackson或做好类型转换fastjson栈溢出错误StackOverflowError对象间存在循环引用且未正确处理1. 使用JsonIgnore打断循环引用2. 使用JsonIdentityInfoJackson3. 使用DTO代替完整的实体进行序列化内存溢出OOM一次性解析巨大的JSON字符串或数组1. 使用流式APIJsonParser分批处理2. 增加JVM堆内存临时方案3. 与数据提供方协商分页获取数据性能突然变慢1. 单例ObjectMapper被重复配置2. 缓存失效3. JSON结构异常复杂1. 确保ObjectMapper等重型对象被复用2. 检查是否有大量重复的短字符串导致StringTable压力大可观察GC日志3. 对复杂JSON考虑简化结构或使用更高效的访问方式如JSONPath调试技巧打印中间结果在复杂转换前先将JSON字符串或对象用JSON.toJSONString(obj, SerializerFeature.PrettyFormat)fastjson或mapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj)Jackson漂亮地打印出来直观对比。开启fastjson的Feature.DisableCircularReferenceDetect在调试循环引用问题时暂时关闭此特性让错误暴露出来。使用Jackson的DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES在开发环境开启此特性默认就是开启的让未知字段报错有助于提前发现数据契约不匹配的问题。单元测试是王道为每一个重要的JSON转换接口编写单元测试覆盖正常 case 和边界 case如null、空字符串、字段缺失、类型错误。这是保证代码健壮性的最有效手段。JSON转换就像编程中的螺丝刀看起来简单但用不好就会让整个项目松松垮垮。从理解基础用法到规避安全陷阱再到掌握性能优化和复杂场景处理每一步都需要耐心和实践。希望这篇长文能成为你手边的一份实用指南下次再遇到JSON的“妖魔鬼怪”时能够从容应对。记住选择适合的工具编写安全的代码处理好异常情况你的程序就会稳健很多。

相关新闻

3步彻底解决百度网盘限速问题:BaiduPCS-Web完整实战手册

3步彻底解决百度网盘限速问题:BaiduPCS-Web完整实战手册

3步彻底解决百度网盘限速问题:BaiduPCS-Web完整实战手册 【免费下载链接】baidupcs-web 项目地址: https://gitcode.com/gh_mirrors/ba/baidupcs-web 还在为百度网盘下载速度慢如蜗牛而烦恼吗?是否经历过下载大文件时进度条几乎不动,…

2026/10/9 1:04:36 阅读更多 →
OBD2协议实战指南:从硬件连接到数据解析与应用开发

OBD2协议实战指南:从硬件连接到数据解析与应用开发

1. 项目概述:从“黑盒子”到“数据金矿” 如果你是一位汽车维修技师、一个热衷于DIY改装的汽车爱好者,或者是一名嵌入式开发工程师,那么你大概率听说过OBD2这个名字。它就像一个焊在汽车仪表盘下方的神秘接口,连接着车辆的“大脑”…

2026/10/9 20:33:32 阅读更多 →
GTA圣安地列斯存档编辑器:你的游戏进度完全掌控工具

GTA圣安地列斯存档编辑器:你的游戏进度完全掌控工具

GTA圣安地列斯存档编辑器:你的游戏进度完全掌控工具 【免费下载链接】gtasa-savegame-editor GUI tool to edit GTA San Andreas savegames. 项目地址: https://gitcode.com/gh_mirrors/gt/gtasa-savegame-editor 你是否曾经在《侠盗猎车手:圣安地…

2026/10/3 22:25:28 阅读更多 →

最新新闻

AI介入测试工作流程之后,如何把控测试质量和问责?

AI介入测试工作流程之后,如何把控测试质量和问责?

AI 测试工作流中的“人在环上”人工审核关口示意AI 负责把测试做快,人负责把生成内容人工审核到位。内容确认清楚,测试质量控制与责任归属才同时成立。AI 介入测试工作流程之后,测试和验收不再是“系统跑过一遍”那么简单——当 AI 辅助测试 …

2026/10/11 5:39:49 阅读更多 →
【联系jmeter】ServeRest

【联系jmeter】ServeRest

ServeRest 它支持完整的 GET/POST/PUT/DELETE 操作和数据持久化,能让你练习增删改查、头认证、查询字符串等核心技能;官方推荐用 Docker 或 npx 两种方式在 Linux 上本地运行。选哪种取决于你机器上已经有什么。 🐳 方式一:使用 D…

2026/10/11 5:39:49 阅读更多 →
为什么有validation set(验证集)还会产生过拟合问题?

为什么有validation set(验证集)还会产生过拟合问题?

回顾训练集和验证集的训练过程先是在训练集进行训练,然后把训练好的模型放到验证集上去验证,例如我们在训练集上得到的三个模型,放到验证集上验证并选择loss最小的模型其实我们换个视角来看,也就是三个模型在验证集继续进行训练&a…

2026/10/11 5:39:49 阅读更多 →
git常用操作流程

git常用操作流程

一:正常工作目录开发功能: 1.git checkout ct_work_1 : 切换到工作分支ct_work_1 2.git fetch origin :先把服务器最新状态拉下来,刷新 origin/IPC_Dev 3.git merge origin/IPC_Dev :将ct_work_1刷新到最新代码 5.描述工作内容:3.1 问题/目标。3.2 当前环…

2026/10/11 5:39:49 阅读更多 →
别再无脑用自增ID了!深度剖析 UUID/GUID 踩坑史与现代数据库终极方案 UUID v7

别再无脑用自增ID了!深度剖析 UUID/GUID 踩坑史与现代数据库终极方案 UUID v7

几乎每个做后端或架构的同学,都经历过主键选型的纠结: 用数据库自增 ID? 简单高效,但一旦遇到分库分表、微服务数据同步、或者不想对外暴露业务单量(比如竞争对手通过 order_id1001, 1002 轻易推算你每天的订单数&…

2026/10/11 5:39:49 阅读更多 →
Claude Code解惑硬核玩法:树莓派上跑TaoToken统一API通道是什么体验?

Claude Code解惑硬核玩法:树莓派上跑TaoToken统一API通道是什么体验?

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 5:38:48 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →