Java JSON处理实战:从JSONObject/JSONArray解析到库选型与避坑指南
1. 从“字符串”到“对象”为什么我们需要JSON处理类如果你写过Java Web应用或者调用过任何第三方API大概率遇到过一种场景你收到了一串长得像下面这样的文本{ user: { name: 张三, age: 25, hobbies: [coding, reading, gaming] }, status: success }这串文本就是JSONJavaScript Object Notation。它本质上是一种轻量级的数据交换格式用人类可读的文本以键值对的形式来存储和传输数据。它独立于语言但结构清晰所以迅速成为了Web API和配置文件的事实标准。那么问题来了在Java这个强类型、面向对象的语言里我们怎么处理这种“无类型”的文本数据呢难道要自己用String的split、indexOf去解析吗那简直是噩梦。这就是JSONObject和JSONArray这类工具类诞生的背景。它们存在的核心价值就是在Java的静态类型世界和JSON的动态数据结构之间架起一座高效、安全的桥梁。简单来说JSON是规则是协议是那串文本数据本身。JSONObject对应JSON中的花括号{}用来表示一个无序的键值对集合。在Java里你可以把它理解为一个特别灵活的、键只能是字符串的MapString, Object。JSONArray对应JSON中的方括号[]用来表示一个有序的值序列。在Java里它类似于一个可以存放任意类型对象的ListObject。接下来的内容我会抛开那些笼统的概念直接带你深入这几个类的内部看看它们到底怎么用为什么这么设计以及在实战中会遇到哪些坑又该如何优雅地避开。我们主要围绕最常用、也最经典的org.json库即json.jar来展开因为它的API设计直观是很多人的入门选择。当然我也会对比其他主流方案让你知道何时该作何选择。2. 核心类深度拆解JSONObject的里里外外JSONObject是你处理JSON时打交道最多的类。它的核心任务是把一个{...}包裹的JSON对象变成一个可以方便操作的内存中的结构。2.1 构造多种入口适应不同场景创建JSONObject对象有几种常见方式对应着不同的数据来源方式一从空对象开始逐步构建这是最直接的方式适用于你需要在代码中动态组装一个JSON对象的场景。import org.json.JSONObject; JSONObject userObj new JSONObject(); userObj.put(name, 张三); userObj.put(age, 25); userObj.put(isStudent, false); // 嵌套一个子对象 JSONObject address new JSONObject(); address.put(city, 北京); address.put(street, 海淀区); userObj.put(address, address); // 嵌套一个数组 userObj.put(tags, new JSONArray().put(活跃).put(VIP));put方法会返回JSONObject自身所以也支持链式调用new JSONObject().put(k1, v1).put(k2, v2)。方式二从JSON格式字符串解析这是最常用的场景当你从网络请求、文件或数据库中读取到JSON字符串时。String jsonString {\name\:\李四\, \score\:88.5}; JSONObject obj new JSONObject(jsonString); // 关键构造方法 System.out.println(obj.getString(name)); // 输出李四这里有个关键细节JSONObject的构造方法在解析字符串时如果字符串格式不符合JSON规范比如键名没加双引号或者尾多了逗号会直接抛出JSONException。这是一种“快速失败”的策略有助于在数据入口就发现问题。方式三从Map转换如果你已经有一个MapString, Object结构的数据转换非常方便。MapString, Object map new HashMap(); map.put(product, 手机); map.put(price, 2999.99); map.put(inStock, true); JSONObject obj new JSONObject(map); System.out.println(obj.toString()); // 输出完整的JSON字符串这种方式很实用特别是在整合旧系统或者处理来自其他框架的数据时。2.2 数据存取类型安全与灵活性的权衡JSONObject提供了丰富的getXxx和optXxx方法来获取值这是使用中的核心也最容易踩坑。getXxx系列严格类型检查这类方法要求键存在且值的类型必须匹配。如果不匹配抛出JSONException。JSONObject obj new JSONObject({\id\: 101, \name\:\Alice\}); int id obj.getInt(id); // 正确返回101 String name obj.getString(name); // 正确返回Alice // 危险操作 String idAsString obj.getString(id); // 抛出JSONException! 因为id对应的值是数字类型(101)不是字符串。 int nameAsInt obj.getInt(name); // 抛出JSONException! name是字符串无法转为int。getXxx方法适用于你非常确定数据结构的情况。它能帮你提前发现类型错误但需要你做好异常处理。optXxx系列宽容的类型转换与默认值这是我个人更推荐在大多数业务场景中使用的方法因为它更健壮。opt是“optional”的缩写。键不存在时返回null或你提供的默认值而不是抛出异常。类型不匹配时会尝试进行合理的类型转换。这是它与getXxx最大的不同。JSONObject obj new JSONObject({\id\: \101\, \count\: 50}); // optString: 尝试将值转为String。数字50会被转为字符串50 String id obj.optString(id); // 返回 101 (字符串) String count obj.optString(count); // 返回 50 (数字被转换成了字符串) String missing obj.optString(missingKey); // 返回空字符串 String missingWithDefault obj.optString(missingKey, N/A); // 返回 N/A // optInt: 尝试将值转为int。字符串101会被解析为整数101 int idInt obj.optInt(id); // 返回 101 (字符串被解析了) int countInt obj.optInt(count); // 返回 50 int missingInt obj.optInt(missingKey); // 返回 0 int missingIntWithDefault obj.optInt(missingKey, -1); // 返回 -1optXxx的这种“宽容”特性使得代码在面对API字段变更或数据不完整时更具弹性。但也要注意比如optBoolean(“key”)只有字符串“true”忽略大小写和布尔值true才会返回true数字或其他字符串都会返回false这可能与直觉不符。 注意关于null值org.json库的设计中put一个null值会导致该键被移除remove。而optXxx方法在键不存在时返回的默认值如optString返回“”optInt返回0可能与实际数据中就是空字符串或0的情况混淆。如果业务上需要严格区分“字段不存在”和“字段值为null”你需要使用has()方法先判断键是否存在或者考虑使用其他JSON库如Jackson、Gson它们对null的处理更精细。2.3 遍历与序列化遍历由于JSONObject内部类似Map你可以用keys()方法获取一个Iterator来遍历。JSONObject obj new JSONObject({\a\:1, \b\:2}); IteratorString keys obj.keys(); while (keys.hasNext()) { String key keys.next(); Object value obj.get(key); // 注意这里返回的是最通用的Object类型 System.out.println(key : value (类型: value.getClass().getSimpleName() )); }序列化转成字符串toString()方法是最常用的。它还有一个重载版本toString(int indentFactor)可以生成格式化的、带缩进的JSON字符串非常适合调试和日志输出。JSONObject obj new JSONObject().put(name, Tom).put(age, 30); System.out.println(obj.toString()); // 输出紧凑格式{name:Tom,age:30} System.out.println(obj.toString(2)); // 输出美化格式缩进2个空格 // 输出 // { // name: Tom, // age: 30 // }3. 有序集合的容器JSONArray详解JSONArray用来处理JSON中的数组结构[...]。你可以把它看作一个功能增强的ArrayList专门为存储和操作JSON数组元素而设计。3.1 创建与元素操作创建JSONArray和JSONObject类似可以从空数组、JSON字符串或Java的Collection/数组构建。// 1. 空数组动态添加 JSONArray arr new JSONArray(); arr.put(first); arr.put(123); arr.put(new JSONObject().put(key, value)); arr.put(new JSONArray().put(nested)); // 2. 从JSON字符串解析 String arrayStr [\apple\, \banana\, 123, true]; JSONArray arrFromStr new JSONArray(arrayStr); // 3. 从List转换 ListObject list Arrays.asList(red, green, blue); JSONArray arrFromList new JSONArray(list);put方法用于在数组末尾添加元素。和JSONObject一样它也支持链式调用。你还可以用put(index, value)在指定索引位置插入元素。3.2 元素访问与遍历访问JSONArray中的元素同样有getXxx和optXxx两套方法逻辑与JSONObject完全一致只是通过索引index而非键key来定位。JSONArray arr new JSONArray([{\name\:\John\}, 25, [1,2,3]]); // getXxx 严格检查 JSONObject firstObj arr.getJSONObject(0); // 获取索引0的元素并期望它是JSONObject int secondInt arr.getInt(1); // 获取索引1的元素期望是Int // optXxx 宽松转换带默认值 String secondAsString arr.optString(1); // 返回 25 String outOfBound arr.optString(10, default); // 索引10不存在返回 default // 遍历 for (int i 0; i arr.length(); i) { Object element arr.get(i); // 获取原始Object类型 // 通常需要根据业务逻辑判断element的实际类型 if (element instanceof JSONObject) { // 处理对象 } else if (element instanceof JSONArray) { // 处理数组 } else if (element instanceof String) { // 处理字符串 } // ... 其他类型 }这里有一个非常重要的实践建议在遍历或处理JSONArray/JSONObject中取出的Object时务必先进行类型判断instanceof再进行强制类型转换。直接强转非常危险是运行时ClassCastException的常见根源。3.3 嵌套结构的处理JSON的强大之处在于可以任意嵌套。JSONObject里可以包含JSONArrayJSONArray里也可以包含JSONObject。处理这种结构的关键是“逐层剥开”。假设我们有如下复杂的JSON数据{ department: 研发部, employees: [ { id: 1, name: 老王, skills: [Java, Spring, MySQL] }, { id: 2, name: 小李, skills: [Python, Django, Redis] } ] }对应的Java解析代码String complexJson ...; // 上面的JSON字符串 JSONObject deptObj new JSONObject(complexJson); String deptName deptObj.getString(department); JSONArray employees deptObj.getJSONArray(employees); for (int i 0; i employees.length(); i) { JSONObject emp employees.getJSONObject(i); // 第一层获取数组中的每个对象 int id emp.getInt(id); String name emp.getString(name); JSONArray skills emp.getJSONArray(skills); // 第二层获取对象中的数组 System.out.print(name 的技能); for (int j 0; j skills.length(); j) { String skill skills.getString(j); // 第三层获取数组中的字符串 System.out.print(skill ); } System.out.println(); }这种“对象-数组-对象-...”的逐级getJSONObject/getJSONArray调用是处理嵌套JSON的标准模式。思路一定要清晰明确每一层的数据结构是什么。4. 实战避坑与进阶技巧纸上谈兵终觉浅真正用起来才会遇到各种“惊喜”。下面分享几个我踩过坑后总结的经验。4.1 日期与特殊类型的处理org.json库默认只支持标准JSON类型String,Number,Boolean,JSONObject,JSONArray, 和JSONObject.NULL。这意味着Date、LocalDateTime等Java常用类型直接put进去会出问题。JSONObject obj new JSONObject(); obj.put(createTime, new Date()); // 危险 System.out.println(obj.toString()); // 输出可能类似于{createTime:{date:24,hours:15...}}这根本不是标准的JSON日期格式。 // 其他解析端如前端JavaScript根本无法识别。正确做法是序列化为标准格式如时间戳或ISO 8601字符串再存储。import java.text.SimpleDateFormat; JSONObject obj new JSONObject(); Date now new Date(); // 方法1存储时间戳毫秒数 obj.put(timestamp, now.getTime()); // 长整型数字 // 方法2存储ISO 8601格式字符串推荐可读性好且标准 SimpleDateFormat sdf new SimpleDateFormat(yyyy-MM-ddTHH:mm:ss.SSSZ); sdf.setTimeZone(TimeZone.getTimeZone(UTC)); // 使用UTC时区是国际惯例 obj.put(isoDate, sdf.format(now)); // 在Java 8中使用java.time包 import java.time.Instant; obj.put(isoDate2, Instant.now().toString()); // 直接生成ISO字符串反过来从JSON中读取日期时你需要根据存入的格式进行相应的解析。4.2 性能考量与大型JSON处理org.json库简单易用但在处理**非常大的JSON字符串几MB甚至几十MB**时需要注意性能。它的JSONObject(String)和JSONArray(String)构造方法会一次性将整个字符串解析成内存中的对象树。如果JSON非常大会消耗大量堆内存可能引发OutOfMemoryError。对于大文件或流式数据应考虑使用流式解析库如Jackson的JsonParser或Gson的JsonReader。它们像“拉链”一样允许你逐个令牌token地读取JSON内容而不必一次性加载整个文档到内存。// 伪代码示例展示流式解析思路以Jackson为例 JsonFactory factory new JsonFactory(); try (JsonParser parser factory.createParser(new File(huge.json))) { while (parser.nextToken() ! null) { String fieldName parser.getCurrentName(); // 根据fieldName决定是否处理当前值可以跳过不关心的庞大子树 if (importantArray.equals(fieldName)) { // 只解析我们关心的部分数组 parser.readArrayAs(List.class); } else { parser.skipChildren(); // 跳过不关心的对象或数组 } } }如果你的场景只是处理配置文件或API响应通常几百KB以内org.json完全够用。一旦涉及日志文件、数据导出等庞大数据务必提前评估并选择流式方案。4.3 库的选择org.json vs. Jackson vs. Gsonorg.json是入门首选但生态中还有更强大的选择。org.json轻量一个jar包API极其简单直观零依赖。适合小型项目、快速原型、Android应用因为包体积小。缺点是功能相对单一如不支持流式解析、注解绑定对null的处理有些特殊社区活跃度一般。Jackson功能最全、性能最优通常、社区最活跃的“王者”。支持流式API、树模型类似JSONObject、数据绑定JSON直接转Java对象。与Spring生态深度集成。缺点是API相对复杂包体积较大。GsonGoogle出品API设计非常简洁优雅数据绑定功能用起来很舒服。在易用性和功能之间取得了很好的平衡。性能略逊于Jackson但对于绝大多数应用绰绰有余。选型建议新手学习、小型工具用org.json快速上手理解基本概念。大型Web项目特别是Spring Boot直接用Jackson它是Spring Boot的默认集成库无需额外配置性能好功能强。追求API简洁、需要频繁进行对象与JSON互转可以尝试Gson它的toJson()和fromJson()方法非常直观。4.4 一个常见的循环引用陷阱这在组装复杂JSON时可能遇到。例如对象A引用了对象B对象B又引用了对象A。JSONObject objA new JSONObject(); JSONObject objB new JSONObject(); objA.put(ref, objB); objB.put(ref, objA); // 循环引用 System.out.println(objA.toString()); // 这里会发生什么使用org.json库的toString()方法遇到循环引用会直接抛出JSONException提示栈溢出风险。这是一个安全保护机制。Jackson和Gson在默认配置下也会抛出异常或进入无限循环。解决方案在设计数据结构时应避免循环引用。如果业务上确实需要如双向关联在序列化时可以通过JsonIgnoreJackson或excludeFieldsGson等注解忽略掉一方的引用或者定制序列化逻辑只序列化ID而非整个对象。5. 综合案例构建一个API响应解析工具让我们用一个接近真实场景的例子来串联所有知识点。假设我们要调用一个天气预报API返回的JSON结构如下{ city: { name: 北京, id: CN101010100 }, data: [ { date: 2023-10-27, temp: { max: 18, min: 8 }, weather: 晴, wind: 微风 }, { date: 2023-10-28, temp: { max: 16, min: 6 }, weather: 多云, wind: 北风3-4级 } ], status: ok, updateTime: 2023-10-27T08:00:00Z }我们的任务是解析它并计算未来两天的平均最高温度。import org.json.JSONArray; import org.json.JSONObject; public class WeatherParser { public static double parseAndCalculateAvgMaxTemp(String apiResponseJson) { try { // 1. 解析根对象 JSONObject root new JSONObject(apiResponseJson); // 2. 检查状态 String status root.optString(status, error); if (!ok.equals(status)) { System.err.println(API返回状态异常: status); return -1; } // 3. 获取城市信息演示嵌套对象访问 JSONObject city root.optJSONObject(city); if (city ! null) { String cityName city.optString(name); System.out.println(城市: cityName); } // 4. 获取天气预报数据数组 JSONArray forecastData root.optJSONArray(data); if (forecastData null || forecastData.length() 0) { System.out.println(无预报数据); return -1; } // 5. 遍历数组计算最高温度平均值 double totalMaxTemp 0.0; int count 0; for (int i 0; i forecastData.length(); i) { // 安全地获取数组中的对象 JSONObject dayForecast forecastData.optJSONObject(i); if (dayForecast null) { continue; // 跳过非对象元素 } // 安全地获取温度对象 JSONObject temp dayForecast.optJSONObject(temp); if (temp null) { continue; } // 使用optInt获取最高温如果字段缺失或非数字默认为0这里根据业务逻辑或许应该用更合理的默认值或跳过 int maxTemp temp.optInt(max, Integer.MIN_VALUE); // 使用一个明显无效的默认值 if (maxTemp ! Integer.MIN_VALUE) { totalMaxTemp maxTemp; count; // 顺便打印一下信息 String date dayForecast.optString(date, N/A); String weather dayForecast.optString(weather, N/A); System.out.printf(日期: %s, 天气: %s, 最高温: %d°C%n, date, weather, maxTemp); } } // 6. 返回计算结果 if (count 0) { double avg totalMaxTemp / count; System.out.printf(未来%d天平均最高温度: %.1f°C%n, count, avg); return avg; } else { System.out.println(未找到有效的温度数据); return -1; } } catch (Exception e) { // 捕获所有异常包括JSON解析异常、空指针等 System.err.println(解析天气预报数据时发生错误: e.getMessage()); e.printStackTrace(); return -1; } } public static void main(String[] args) { String jsonResponse ...; // 实际的API响应字符串 parseAndCalculateAvgMaxTemp(jsonResponse); } }这个案例涵盖了之前提到的多个要点使用optXxx保证健壮性在解析不可控的外部API数据时optJSONObject、optJSONArray、optString、optInt是首选避免了因字段缺失或类型意外而导致的程序崩溃。安全的嵌套访问每次访问下一层对象前都检查上一层返回的是否为null。异常处理用try-catch包裹整个解析逻辑防止因数据格式错误导致主流程中断。业务逻辑与数据解析分离解析代码只负责安全地提取数据计算平均值的逻辑清晰独立。最后关于org.json库还有一个我个人的习惯对于复杂的、结构固定的API响应一旦项目规模变大我更倾向于使用Jackson或Gson的数据绑定功能定义对应的Java Bean类如WeatherResponse、City、DailyForecast然后用一行代码objectMapper.readValue(json, WeatherResponse.class)完成反序列化。这样代码更类型安全、更简洁也利于维护。但对于快速脚本、测试或者结构极其灵活的数据JSONObject和JSONArray这种“树模型”的灵活性和直观性依然是无可替代的利器。理解它们的每一处细节能让你在Java处理JSON的世界里更加游刃有余。

相关新闻

React Router中push与replace的区别解析:精准控制浏览器历史记录栈

React Router中push与replace的区别解析:精准控制浏览器历史记录栈

一、引言与背景 1.1 React Router的history模式概述 在React单页应用(SPA)开发中,路由管理是核心环节。React Router作为最流行的路由库,提供了强大的导航能力。在其history模式(即BrowserRouter)下,应用依赖HTML5的History API来实现URL的变…

2026/10/17 11:51:14 阅读更多 →
ST-LINK V2调试器实战指南:从驱动安装到高级调试与故障排查

ST-LINK V2调试器实战指南:从驱动安装到高级调试与故障排查

1. 从“吃灰”到“救星”:ST-LINK V2的定位与价值如果你手头有一块STM32的开发板,或者正准备开始STM32的学习与开发,那么你大概率绕不开一个叫做“ST-LINK”的小玩意儿。它可能静静地躺在开发板的包装盒里,也可能被单独售卖&#…

2026/10/7 2:33:19 阅读更多 →
VESTA附加对象功能详解:从基础操作到科研绘图实战

VESTA附加对象功能详解:从基础操作到科研绘图实战

1. 项目概述:从“附加对象”看VESTA的无限扩展性如果你用过VESTA这款晶体结构可视化软件,那你一定对它的核心功能——绘制晶胞、原子、键、多面体——非常熟悉。但很多时候,我们想展示的东西远不止这些。比如,你想在结构图上标出某…

2026/10/15 0:01:57 阅读更多 →

最新新闻

DB2性能故障诊断:临时表空间膨胀引发的LATCH竞争与STACK分析方法

DB2性能故障诊断:临时表空间膨胀引发的LATCH竞争与STACK分析方法

简介:一份关于DB2数据库系统临时表空间过大引发性能问题的真实案例文档,面向DBA、数据库运维工程师及DB2技术学习者,尤其适合处理SQL执行变慢、活动会话数异常升高等疑难场景。资源包为单个doc文档,约607KB,便于直接阅…

2026/10/17 22:54:50 阅读更多 →
数据压缩会议论文精要:熵编码技术演进与压缩器工程实现

数据压缩会议论文精要:熵编码技术演进与压缩器工程实现

简介:2017年数据压缩大会(Data Compression Conference)论文集,聚焦信息编码与数据压缩技术的最新进展,适合数据科学家、算法工程师及计算机领域科研人员阅读,也可用于追踪领域内最新动态。文档以单个PDF文…

2026/10/17 22:54:50 阅读更多 →
全国省市县街道邮编及经纬度数据表构建:从清洗到坐标纠偏

全国省市县街道邮编及经纬度数据表构建:从清洗到坐标纠偏

简介:全国省、市、区、县、乡、镇、街道邮编及经纬度坐标数据集,收录46090条行政区划记录,覆盖从省级到街道的完整层级,面向GIS开发、物流配送、地图服务及数据分析等场景,可为地址解析、路径规划、区域统计提供基础数…

2026/10/17 22:54:50 阅读更多 →
SAP电子签名与电子记录合规本质:从21 CFR Part 11到GMP责任落地

SAP电子签名与电子记录合规本质:从21 CFR Part 11到GMP责任落地

简介:本资源是一份面向医药、GMP合规及SAP系统实施人员的专业技术PPT,聚焦电子签名(Electronic Signatures)与电子记录(Electronic Records)在SAP ERP系统中的合规落地路径,核心解决FDA 21 CFR …

2026/10/17 22:54:50 阅读更多 →
SparkSQL vs RDD:为什么结构化查询才是数据工程的正确起点

SparkSQL vs RDD:为什么结构化查询才是数据工程的正确起点

1. 为什么我坚持用SparkSQL而不是纯RDD写数据处理逻辑刚接触PySpark时,我跟大多数初学者一样,看到“RDD”这个词就本能地觉得“底层”“高效”“专业”,于是吭哧吭哧写了一堆map、filter、reduceByKey,代码跑起来后发现&#xff1…

2026/10/17 22:54:50 阅读更多 →
PowerPoint内嵌JS运行器:零基础JavaScript教学课件实战

PowerPoint内嵌JS运行器:零基础JavaScript教学课件实战

简介:本资源是一份面向零编程基础学习者的《JavaScript基础教程》课件PPT,专为Web前端入门设计,解决初学者对JavaScript核心语法、运行机制与实践应用的认知断层问题。课件系统覆盖50个关键知识点,包括变量声明(var/le…

2026/10/17 22:52:48 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →