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/8/13 8:43:53 阅读更多 →
2026年数学建模国赛A题算法(14):多物理场耦合(热-力-电)的松耦合迭代算法及其在锂离子电池热-力-电耦合模拟中的应用

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

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

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

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

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

2026/8/13 8:43:53 阅读更多 →

最新新闻

2小时,我搭了一套项目任务进度跟踪系统,再也不用每天追着员工问进度

2小时,我搭了一套项目任务进度跟踪系统,再也不用每天追着员工问进度

我发现很多企业做项目,有一个非常明显的规律: 项目越往后,项目经理越忙。 刚开始启动项目的时候,大家按照计划推进,看起来一切正常。 但到了中后期,项目经理每天都在处理同一类事情: 催任务…

2026/8/13 9:44:40 阅读更多 →
PS 2026智能交互升级:高光显示与预测UI解析

PS 2026智能交互升级:高光显示与预测UI解析

1. 2026版PS视图交互革命:选择项与高光显示的智能化演进 作为Adobe Photoshop的深度用户,最近在测试2026版本时发现了一个颠覆性的界面改进——工具选择项和高光显示机制发生了根本性变化。这个看似细微的调整实际上彻底改变了我的工作流程效率。当使用矩…

2026/8/13 9:44:40 阅读更多 →
C# WinForms TableLayoutPanel布局控件详解:从原理到实战应用

C# WinForms TableLayoutPanel布局控件详解:从原理到实战应用

1. 项目概述:为什么TableLayoutPanel是C#桌面开发的“布局神器”? 在C#的WinForms桌面应用开发里,界面布局一直是个既基础又让人头疼的问题。尤其是当你需要设计一个包含多个控件、且要求行列对齐规整的复杂表单时,传统的锚定&…

2026/8/13 9:44:40 阅读更多 →
中科慧思灵巧手技术解析:从多指协同到弹吉他实战开发

中科慧思灵巧手技术解析:从多指协同到弹吉他实战开发

最近在机器人领域,一个非常有趣的进展引起了我的注意:中科慧思发布了L1、D1、M1三款灵巧手,并且现场演示了弹吉他的能力。这不仅仅是“机器人会弹琴”这么简单,它背后代表着机器人末端执行器——也就是“手”——在精细化操作、多…

2026/8/13 9:44:40 阅读更多 →
算法竞赛第一题精解:从字符串子串权重和问题掌握贡献法思维

算法竞赛第一题精解:从字符串子串权重和问题掌握贡献法思维

如果你是一名参加过蓝桥杯、ACM等算法竞赛的选手,或者正在准备这类比赛,那么你一定对“7.28 国赛1”这个标题感到既熟悉又陌生。熟悉的是,它指向了2024年7月28日举行的某场国家级算法竞赛的第一题;陌生的是,网络上关于…

2026/8/13 9:44:40 阅读更多 →
解锁QQ音乐加密音频:qmcdump让你的音乐重获自由

解锁QQ音乐加密音频:qmcdump让你的音乐重获自由

解锁QQ音乐加密音频:qmcdump让你的音乐重获自由 【免费下载链接】qmcdump 一个简单的QQ音乐解码(qmcflac/qmc0/qmc3 转 flac/mp3),仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdump 你是否曾经遇…

2026/8/13 9:43:39 阅读更多 →

日新闻

Visual Studio新建项目解决方案为空:系统性排查与修复指南

Visual Studio新建项目解决方案为空:系统性排查与修复指南

1. 问题现象与本质剖析如果你是一位.NET开发者,或者正准备踏入这个领域,那么Visual Studio(后面简称VS)绝对是你绕不开的伙伴。但有时候,这个伙伴会跟你开一个不大不小的玩笑:你满怀期待地点击“创建新项目…

2026/8/13 0:00:09 阅读更多 →
长春建设厅网站:普通人买房办事必看的真实指南与避坑攻略

长春建设厅网站:普通人买房办事必看的真实指南与避坑攻略

说实话,每次提起“长春建设厅网站”这几个字,我心里都挺有感触的。不是因为它有多高大上,也不是因为那里藏着什么不可告人的秘密,恰恰相反,是因为它太“接地气”了,或者说,它是咱们普通人想要在这个城市好好生活、安稳买房时,必须得翻过的一座“数据山”。很多新朋友第…

2026/8/13 0:00:09 阅读更多 →
Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案

Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案

Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案 【免费下载链接】rdpwrap.ini RDPWrap.ini for RDP Wrapper Library by StasM 项目地址: https://gitcode.com/GitHub_Trending/rd/rdpwrap.ini 你是否曾为Windows家庭版无法支持多用户远程桌面…

2026/8/13 0:00:09 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/13 2:38:34 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/12 1:11:09 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/12 1:11:08 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/11 17:09:45 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/12 1:11:10 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/11 17:09:45 阅读更多 →