Java JSONObject实战:从字符串解析到对象操作,避坑指南与性能优化
1. 从“字符串”到“对象”为什么我们需要JSONObject如果你写过Java尤其是处理过网络请求或者配置文件那你一定对JSON不陌生。它看起来就是一堆用大括号、中括号、逗号和冒号组织起来的文本。比如一个简单的用户信息{name: 张三, age: 30, city: 北京}。在程序的世界里我们拿到手的往往就是这样一个长长的字符串。但程序要处理的是结构化的数据是属性是值。你总不能每次都靠String.substring()和indexOf()去笨拙地切割和查找吧那不仅代码冗长易错而且毫无优雅可言。这就是JSONObject登场的核心场景。它不是一个神秘的新技术而是一个工具一个翻译官。它的核心使命就是将程序员眼中难以直接操作的JSON格式字符串翻译成Java程序可以轻松理解和操纵的“对象”。你可以把它想象成一个功能强大的“字典”或“映射表”。这个“字典”的键Key是字符串比如name、age值Value则可以是字符串、数字、布尔值、另一个JSONObject嵌套对象或者一个JSONArray数组。通过JSONObject你不再需要面对原始的字符串而是可以通过getString(name)、getInt(age)这样的方法像访问对象的属性一样直接、安全地获取你需要的数据。无论是从HTTP接口接收响应还是读取本地的配置文件或是需要将程序内存中的对象序列化成字符串进行传输或存储JSONObject都扮演着至关重要的角色。它简化了数据交换的复杂度是前后端分离、微服务架构下不可或缺的基础组件。接下来我们就深入这个“翻译官”的内部看看它到底怎么用以及在实际项目中如何用得更好、更稳。2. 核心武器库JSONObject的创建与基础操作工欲善其事必先利其器。使用JSONObject的第一步自然是引入相关的库。在Java生态中主要有两个流行的选择Fastjson阿里巴巴开源和Jackson社区更主流。为了覆盖更广的场景并避免依赖单一库可能带来的风险如Fastjson历史上的安全漏洞我们这里以功能全面、社区活跃的Jackson为例进行讲解。当然核心的JSONObject概念是相通的。首先在你的Maven项目pom.xml中添加依赖dependency groupIdcom.fasterxml.jackson.core/groupId artifactIdjackson-databind/artifactId version2.15.0/version !-- 请使用当前稳定版本 -- /dependency2.1 三种创建方式从无到有从字符串到对象创建JSONObject在Jackson中对应的核心类是ObjectMapper而表示JSON对象的是JsonNode或直接使用Map/POJO但为理解方便我们以操作ObjectNode为例它更贴近JSONObject的 mutable 特性主要有三种途径对应着不同的数据来源。方式一从头开始手动构建当你需要动态组装一个JSON数据时可以从一个空对象开始。import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; ObjectMapper mapper new ObjectMapper(); ObjectNode user mapper.createObjectNode(); // 创建一个空的JSON对象 // 添加键值对 user.put(name, 李四); user.put(age, 28); user.put(isStudent, false); // 添加嵌套对象 ObjectNode address mapper.createObjectNode(); address.put(city, 上海); address.put(street, 浦东新区张江路); user.set(address, address); // 注意这里是set用于设置对象或数组 // 添加数组 ArrayNode hobbies mapper.createArrayNode(); hobbies.add(游泳); hobbies.add(读书); hobbies.add(编程); user.set(hobbies, hobbies); System.out.println(user.toPrettyString()); // 输出 // { // name : 李四, // age : 28, // isStudent : false, // address : { // city : 上海, // street : 浦东新区张江路 // }, // hobbies : [ 游泳, 读书, 编程 ] // }方式二解析JSON字符串最常用的场景这是JSONObject最核心的功能将网络或文件中的JSON字符串转化为可操作的对象。String jsonString {\name\:\王五\,\skills\:[\Java\, \Spring\, \MySQL\]}; ObjectMapper mapper new ObjectMapper(); try { // 解析为JsonNode只读视图适用于读取操作 JsonNode rootNode mapper.readTree(jsonString); String name rootNode.get(name).asText(); // 获取name字段 JsonNode skillsNode rootNode.get(skills); if (skillsNode.isArray()) { for (JsonNode skill : skillsNode) { System.out.println(skill.asText()); } } // 或者解析为具体的Java对象POJO这是更推荐的方式 // 首先定义一个对应的Java类 // public class Person { private String name; private ListString skills; ... getters/setters ... } // Person person mapper.readValue(jsonString, Person.class); // System.out.println(person.getName()); } catch (Exception e) { e.printStackTrace(); // 实际项目中应使用更完善的异常处理 }注意JsonNode是Jackson提供的树模型节点它对于复杂的、动态结构的JSON查询非常方便但它是不可变的immutable。如果你需要对解析后的JSON进行修改应该使用ObjectMapper.readValue(jsonString, ObjectNode.class)将其解析为可变的ObjectNode。方式三从Java对象转换序列化将内存中的Java对象POJO直接转换成JSONObject或JSON字符串用于返回给前端或写入文件。public class Product { private String id; private String name; private double price; // 省略构造函数、getter、setter } Product product new Product(P001, 笔记本电脑, 6999.99); ObjectMapper mapper new ObjectMapper(); // 转换为ObjectNode ObjectNode productNode mapper.valueToTree(product); // 此时可以继续操作productNode productNode.put(discount, 0.9); // 或者直接转换为JSON字符串 String productJson mapper.writeValueAsString(productNode); System.out.println(productJson); // {id:P001,name:笔记本电脑,price:6999.99,discount:0.9}2.2 数据存取精准获取与类型安全从JSONObject或JsonNode中获取数据是日常操作。这里的关键在于类型安全和空值处理。ObjectNode data mapper.createObjectNode(); data.put(count, 100) // 整数 .put(score, 98.5) // 浮点数 .put(passed, true) // 布尔值 .put(title, JSON解析指南) // 字符串 .putNull(optionalField); // 空值 // 1. 直接获取但可能返回null JsonNode titleNode data.get(title); if (titleNode ! null) { String title titleNode.asText(); // 转为字符串 } // 2. 使用asText()等带默认值的方法推荐用于可空字段 String maybeNullTitle data.path(optionalField).asText(默认标题); // 如果字段不存在或为null返回默认标题 // 3. 获取基本类型并处理异常 int count data.get(count).asInt(); // 直接转为int如果不是数字或不存在会抛异常 // 更安全的做法 int safeCount data.path(count).asInt(0); // 使用path不存在或非数字时返回默认值0 double score data.path(score).asDouble(); boolean passed data.path(passed).asBoolean(); // 4. 处理嵌套对象和数组 ObjectNode nested mapper.createObjectNode(); nested.put(innerKey, innerValue); data.set(nestedObj, nested); String innerValue data.path(nestedObj).path(innerKey).asText(); ArrayNode list mapper.createArrayNode(); list.add(A).add(B); data.set(list, list); // 遍历数组 JsonNode listNode data.get(list); if (listNode ! null listNode.isArray()) { for (JsonNode item : listNode) { System.out.println(item.asText()); } }实操心得在实际开发中我强烈建议使用path()方法配合asXxx(defaultValue)来获取值。path()在字段不存在时会返回一个MissingNode不会抛异常再调用asXxx()时就会返回默认值。这比直接用get()然后判空再转换要简洁安全得多能有效避免NullPointerException。3. 进阶实战复杂结构处理与性能陷阱掌握了基础操作我们来看看更复杂的场景和那些容易踩坑的地方。3.1 遍历、查询与过滤当JSON结构非常复杂或不确定时我们需要动态地探索它。String complexJson {\company\:{\name\:\TechCorp\,\departments\:[{\name\:\RD\,\employees\:[{\id\:1,\name\:\Alice\},{\id\:2,\name\:\Bob\}]},{\name\:\Sales\,\employees\:[{\id\:3,\name\:\Charlie\}]}]}}; ObjectMapper mapper new ObjectMapper(); JsonNode root mapper.readTree(complexJson); // 1. 使用字段名直接导航适用于已知结构 String companyName root.path(company).path(name).asText(); JsonNode departments root.path(company).path(departments); // 2. 遍历数组并条件过滤找出所有研发部门的员工 ListString rdEmployeeNames new ArrayList(); if (departments.isArray()) { for (JsonNode dept : departments) { if (RD.equals(dept.path(name).asText())) { JsonNode employees dept.path(employees); if (employees.isArray()) { for (JsonNode emp : employees) { rdEmployeeNames.add(emp.path(name).asText()); } } } } } System.out.println(rdEmployeeNames); // [Alice, Bob] // 3. 使用Jackson的JsonPointer进行精确定位类似XPath JsonPointer pointer JsonPointer.compile(/company/departments/0/employees/0/name); JsonNode aliceNameNode root.at(pointer); // 定位到第一个部门第一个员工的名字 System.out.println(aliceNameNode.asText()); // Alice3.2 日期、自定义对象等特殊类型的序列化与反序列化这是实际项目中的高频痛点。JSON标准本身没有日期类型通常日期被序列化为字符串如2023-10-27T10:30:00Z。Jackson需要知道如何转换。public class Event { private String eventName; private Date eventTime; // java.util.Date private LocalDateTime localEventTime; // java.time.LocalDateTime // ... getters and setters } ObjectMapper mapper new ObjectMapper(); // *** 关键步骤注册Java 8时间模块并配置日期格式 *** mapper.registerModule(new JavaTimeModule()); // 处理java.time包下的类 // 禁用将日期写为时间戳而是使用ISO-8601格式字符串 mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); // 也可以自定义全局格式 // mapper.setDateFormat(new SimpleDateFormat(yyyy-MM-dd HH:mm:ss)); Event event new Event(); event.setEventName(产品发布会); event.setEventTime(new Date()); event.setLocalEventTime(LocalDateTime.now()); // 序列化 String json mapper.writeValueAsString(event); System.out.println(json); // {eventName:产品发布会,eventTime:2023-10-27T02:30:00.00000:00,localEventTime:2023-10-27T10:30:00} // 反序列化 Event parsedEvent mapper.readValue(json, Event.class); System.out.println(parsedEvent.getLocalEventTime());踩坑记录如果你没有注册JavaTimeModule在序列化LocalDateTime字段时会直接抛异常。对于Date类型如果不禁用WRITE_DATES_AS_TIMESTAMPS它会默认被序列化为长整型时间戳如1698385800000虽然机器友好但人类可读性差且前端JavaScript处理时可能需要额外转换。统一使用ISO格式是跨语言交互的最佳实践。3.3 性能考量与最佳实践JSON解析在I/O密集或高并发场景下可能成为性能瓶颈。重用ObjectMapperObjectMapper的创建成本很高它是线程安全的。务必将其声明为静态常量或通过依赖注入框架如Spring管理在整个应用生命周期内重用。public class JsonUtils { private static final ObjectMapper MAPPER new ObjectMapper(); static { MAPPER.registerModule(new JavaTimeModule()); MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 忽略未知字段提高兼容性 } // ... 提供静态工具方法 }选择合适的树模型JsonNode只读操作的首选解析速度快内存占用相对较小。ObjectNode/ArrayNode需要修改JSON结构时使用。POJO绑定在结构固定的情况下强烈推荐使用readValue()和writeValueAsString()直接与POJO转换。这是性能最好的方式因为Jackson会为你的POJO类生成高效的字节码进行序列化/反序列化。处理超大JSON对于几百MB甚至GB级的JSON文件一次性加载到内存的树模型readTree会导致OOM。此时应使用流式APIStreaming API。JsonFactory factory new JsonFactory(); try (JsonParser parser factory.createParser(new File(huge.json))) { while (parser.nextToken() ! null) { String fieldName parser.getCurrentName(); JsonToken token parser.currentToken(); // 根据token类型START_OBJECT, FIELD_NAME, VALUE_STRING等逐步处理 if (importantField.equals(fieldName) token JsonToken.VALUE_STRING) { String value parser.getValueAsString(); // 处理这个值然后可以跳过其他不关心的部分 parser.skipChildren(); } } }流式解析就像SAX解析XML是事件驱动的内存消耗恒定非常适合处理大文件。4. 避坑指南那些年我踩过的JSONObject的“坑”理论讲得再多不如实战踩坑来得深刻。下面分享几个我亲身经历或常见的问题。4.1 日期格式不一致导致的序列化/反序列化失败场景你的服务A使用yyyy-MM-dd HH:mm:ss格式生产JSON服务B使用默认的ISO格式yyyy-MM-ddTHH:mm:ss.SSSZ消费。直接反序列化会失败。根因ObjectMapper的日期格式配置不匹配。解决方案统一格式推荐在架构层面约定所有服务间通信使用ISO-8601格式Jackson默认配置即可。这是行业标准兼容性最好。自定义反序列化如果无法控制生产者可以在消费者端为特定字段或类指定格式。public class MyDto { JsonFormat(pattern yyyy-MM-dd HH:mm:ss, timezone GMT8) private Date customDate; // ... }或者在ObjectMapper上全局设置影响所有Date类型mapper.setDateFormat(new SimpleDateFormat(yyyy-MM-dd HH:mm:ss));4.2 数字类型精度丢失与溢出场景前端JavaScript传递一个很大的整数如{id: 12345678901234567890}Java用Long类型接收但JavaScript的数字是双精度浮点数无法精确表示超过2^53的整数可能导致精度丢失。或者JSON中某个字段有时是整数100有时是浮点数100.0用getInt()去取浮点数时会报错。根因JSON本身不区分整数和浮点数而Java是强类型语言。解决方案对于可能超出JavaLong范围或来自JavaScript的大整数在协议层面将其定义为字符串类型。这是处理如数据库主键雪花ID、金额避免浮点数精度问题的通用做法。{orderId: 12345678901234567890, amount: 99.99}在解析时对于不确定是整数还是浮点数的字段使用JsonNode的asText()先转为字符串或使用isInt()、isLong()、isDouble()判断后再转换。JsonNode numNode jsonObject.get(someNumber); if (numNode.isInt()) { int val numNode.asInt(); } else if (numNode.isDouble()) { double val numNode.asDouble(); } else if (numNode.isTextual()) { // 按字符串处理大数 BigDecimal val new BigDecimal(numNode.asText()); }4.3 循环引用与StackOverflowError场景两个Java对象互相引用如User对象里有ListOrderOrder对象里又有关联的User对象。当你试图用同一个ObjectMapper实例序列化这个User对象时会陷入无限循环最终抛出StackOverflowError。根因默认的序列化行为会遍历对象的所有属性导致循环。解决方案使用JsonIgnore注解在不需要序列化的字段上如Order中的user字段添加此注解直接忽略它。public class Order { private Long id; JsonIgnore // 序列化Order时忽略user字段打破循环 private User user; // ... }使用JsonManagedReference和JsonBackReference注解这是一对注解用于处理父子关系。public class User { JsonManagedReference // 这是“主”方会被正常序列化 private ListOrder orders; // ... } public class Order { JsonBackReference // 这是“从”方序列化时会被忽略 private User user; // ... }自定义序列化器对于复杂场景可以实现JsonSerializer来自定义序列化逻辑。4.4 字段名风格不匹配蛇形vs驼峰场景Java字段名是userName驼峰但JSON数据或API要求字段名是user_name蛇形。根因命名约定不同。解决方案在ObjectMapper上配置属性命名策略。ObjectMapper mapper new ObjectMapper(); // 设置序列化时使用蛇形命名 mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE); // 或者使用注解在特定类上指定 // JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) public class MyEntity { private String userName; // 序列化为 {user_name: xxx} }同样反序列化时ObjectMapper也能自动将蛇形命名的JSON字段映射到驼峰命名的Java字段上需配置或使用对应注解。4.5 空值、空字符串与默认值处理的混乱场景JSON中某个字段可能是null可能是空字符串也可能根本不存在。你的业务逻辑需要区分这三种状态。根因JsonNode的get()和path()方法行为不同asText()对null和空字符串的处理也可能不符合预期。解决方案建立清晰的处理策略。JsonNode node ...; // 1. 判断字段是否存在 boolean hasField node.has(fieldName); // 2. 判断字段是否存在且非null (JSON意义上的null) JsonNode fieldNode node.get(fieldName); boolean isNotNull fieldNode ! null !fieldNode.isNull(); // 3. 获取文本值并明确区分null、空字符串和默认值 String value1 node.path(fieldName).asText(); // 不存在或为null时返回null不path(...).asText()在节点为MissingNode或NullNode时返回空字符串。 // 实际上path(x).asText() 在节点不存在或为null时返回空字符串。这有时会造成混淆。 // 更清晰的做法 JsonNode fn node.path(fieldName); if (fn.isMissingNode()) { // 字段不存在 System.out.println(字段不存在); } else if (fn.isNull()) { // 字段存在值为null System.out.println(字段值为null); } else { // 字段存在且有值 String value fn.asText(); if (value.isEmpty()) { // 值为空字符串 System.out.println(字段值为空字符串); } else { System.out.println(字段值: value); } }理解isMissingNode()、isNull()和asText()的行为差异是写出健壮JSON解析代码的关键。在业务代码中根据场景封装一个工具方法来统一处理这三种状态能极大减少重复和错误。

相关新闻

2026年数学建模国赛A题算法(15):龙格-库塔法(RK4)与自适应步长求解:从经典到智能的常微分方程数值方法研究

2026年数学建模国赛A题算法(15):龙格-库塔法(RK4)与自适应步长求解:从经典到智能的常微分方程数值方法研究

摘要 常微分方程初值问题是科学计算与工程模拟中的核心课题,其数值求解方法的发展贯穿了计算数学的演进历程。本文系统研究了经典四阶龙格-库塔法(RK4)与自适应步长控制策略的理论基础、算法实现及性能特性。在回顾RK4方法的历史渊源与数学推导的基础上,本文深入分析了基于…

2026/10/19 23:29:54 阅读更多 →
2026年数学建模国赛A题算法(14):多物理场耦合(热-力-电)的松耦合迭代算法及其在锂离子电池热-力-电耦合模拟中的应用

2026年数学建模国赛A题算法(14):多物理场耦合(热-力-电)的松耦合迭代算法及其在锂离子电池热-力-电耦合模拟中的应用

摘要 多物理场耦合问题是现代科学与工程计算中的核心挑战之一,尤其在新能源、航空航天、电子封装等领域具有广泛的应用背景。本文针对热-力-电三场耦合问题,系统研究了松耦合迭代算法的数学理论、收敛性分析及高效实现策略。首先,基于物理场的内在耦合机制,建立了热-力-电…

2026/10/20 6:32:29 阅读更多 →
2026年数学建模国赛A题算法(13):边值问题的打靶法与差分法:从理论到工程应用的数学建模研究

2026年数学建模国赛A题算法(13):边值问题的打靶法与差分法:从理论到工程应用的数学建模研究

摘要 边值问题(Boundary Value Problems, BVPs)是微分方程理论中的重要组成部分,广泛应用于物理学、工程学、生物学及经济学等领域。由于解析解的局限性,数值方法成为求解复杂边值问题的主要手段。本文系统研究了求解二阶常微分方程边值问题的两类核心数值方法——打靶法(…

2026/10/17 9:10:44 阅读更多 →

最新新闻

进程与线程的创建与并发执行:操作系统实验核心解析

进程与线程的创建与并发执行:操作系统实验核心解析

1. 实验任务拆解:进程与线程的创建和并发执行,到底在验证什么刚做完操作系统课的第一个实验,题目是“进程、线程的创建与并发执行”,说实话刚开始觉得无非就是调用几个API的事,结果真正上手才发现水很深。这个实验看起…

2026/10/20 6:31:35 阅读更多 →
C#与Zigbee上位机开发:串口通信与传感器数据解析实战

C#与Zigbee上位机开发:串口通信与传感器数据解析实战

简介:基于C#的上位机工程源码,面向物联网与工控领域开发者,解决通过串口对接Zigbee网络、采集传感器信息并显示和控制的问题,典型场景为小区燃气自助监控。工程涵盖串口参数配置与读写、Zigbee数据解析、MySQL数据存储、数据自校验…

2026/10/20 6:31:35 阅读更多 →
数据标注标注框全链路实战:从工具选型到格式转换与质检避坑

数据标注标注框全链路实战:从工具选型到格式转换与质检避坑

简介:这份PPT资料聚焦数据标注中的标注框标注方法,面向机器学习、计算机视觉方向的初学者与算法工程师,帮助其理解图像目标标注的核心思路与典型场景。内容系统梳理了矩形框标注、自由矩形(斜矩形)标注与3D框标注三类方…

2026/10/20 6:31:35 阅读更多 →
基于C#的Zigbee串口上位机开发:从帧解析到设备控制

基于C#的Zigbee串口上位机开发:从帧解析到设备控制

简介:一份基于C#的Zigbee传感器监控上位机完整工程,面向需要开发串口通信、物联网数据采集与控制界面的C#开发者。项目以小区燃气自助监控为应用场景,通过串口对接Zigbee网络,实现传感器信息实时显示、远程控制,并集成…

2026/10/20 6:31:35 阅读更多 →
数据结构-循环链表

数据结构-循环链表

循环链表1. 定义节点2. 创建链表3. 头插4. 尾插5. 是否为空6. 打印(遍历变量)7. 链表长度8. 查找9. 头删10. 尾删11. 指定值删12. 销毁

2026/10/20 6:31:35 阅读更多 →
ArcGIS符号库原理与实战:从语义编码到质量管控

ArcGIS符号库原理与实战:从语义编码到质量管控

简介:本资源是面向GIS从业者、地图制图人员及ArcGIS初高级用户的实用型符号库合集,解决日常项目中符号缺失、风格不统一、制图效率低等核心问题。压缩包共142个文件,包含74个.style符号样式文件(用于直接加载至ArcGIS符号系统&…

2026/10/20 6:30:35 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/19 2:54: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/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →