Java JSONObject核心解析:Fastjson、Jackson与Gson选型、API实战与避坑指南
1. 从字符串到对象JSONObject的日常角色如果你写过Java尤其是处理过网络请求或者配置文件那你肯定绕不开JSON。这东西现在几乎是数据交换的“普通话”了。后台给你一串{name:张三,age:25}前端页面要展示你从数据库查出一堆记录要转换成API接口能吐出去的格式。这些场景里JSONObject就是一个帮你把JSON字符串这个“死”文本变成程序里可以随意操作、访问的“活”对象的关键工具。它不是什么高深莫测的框架但用得好不好直接关系到代码是干净利落还是一团乱麻。今天就来聊聊这个日常开发中的老伙计看看怎么把它用得顺手避开那些常见的坑。2. JSONObject核心定位与选型考量2.1 为什么是JSONObject而不是手动解析在早期处理一段JSON字符串你可能需要自己写一堆字符串截取、分割的代码那种方式脆弱且难以维护。JSONObject的出现本质上是提供了一种标准化的对象模型DOM来映射JSON结构。你可以把它理解为一个MapString, Object但功能更专一、更强大。它的核心价值在于提供类型安全相对的访问虽然Java是强类型但JSON本身是弱类型的。JSONObject在get时提供了如getString、getInteger、getJSONObject等方法这实际上是在解析时做了一层类型校验和转换比你自己从Map里取Object然后强转要安全、清晰得多。简化构建和序列化过程通过put方法构建对象再通过toString()方法直接生成标准JSON字符串这个过程非常直观。自己拼接字符串不仅容易出错比如忘了引号、逗号还可能有特殊字符转义的问题。结构化操作支持它天然支持嵌套JSONObject里套JSONObject或JSONArray可以很方便地处理复杂的数据结构比如一个用户信息里包含多个地址的列表。2.2 主流库选型Fastjson、Jackson与Gson提到JSONObject通常我们指的是特定库提供的实现而不是Java标准库Java EE有官方API但常用的是第三方库。国内最常打交道的莫过于阿里系的Fastjson但它并非唯一选择各有优劣。Fastjson (com.alibaba.fastjson.JSONObject)优点速度极快这也是其名字的由来API设计非常符合中国开发者的习惯简单直接。JSON.parseObject()和toJSONString()几乎成了条件反射。坑点与注意事项历史安全漏洞Fastjson在过去几年里爆出了多个高危反序列化漏洞虽然新版本一直在修复但给项目带来了安全阴影。对于对外提供服务的接口需要谨慎评估。默认自动类型识别AutoType这是其漏洞的主要根源。为了能将JSON字符串反序列化成任意Java类它需要记录类型信息。在新版本中AutoType默认是关闭的或者需要白名单。如果你从老旧系统迁移过来这里是个大坑。语法容错性有时候过于“宽容”例如对尾随逗号、单引号的支持可能导致它解析一些非严格标准的JSON但其他库可能报错。这既是优点也是缺点取决于你对数据规范性的要求。Jackson (com.fasterxml.jackson.databind)优点性能优异社区活跃是Spring Boot默认的JSON库。功能极其强大注解支持完善如JsonIgnoreJsonProperty定制化序列化/反序列化能力超强。与JSONObject的对应Jackson更侧重于通过ObjectMapper直接绑定到POJOPlain Old Java Object上。它也有树模型JsonNode类似于JSONObject但API风格不同。如果你需要高度灵活地动态操作JSON节点JsonNode是更好的选择。Gson (com.google.gson.JsonObject)优点Google出品API简洁干净设计优雅。默认情况下非常严格符合JSON标准安全性相对较好。与Guava等其他Google库集成性好。特点它的JsonObject使用起来和Fastjson的JSONObject类似但API更纯粹。在将JsonObject转换为POJO时需要显式地使用Gson实例这种分离使得职责更清晰。选型建议新项目尤其是Spring Boot项目优先使用Jackson。生态好默认集成无需额外配置性能和功能都有保障。对性能有极致要求且能控制数据源非对外暴露接口的内部系统可以考虑Fastjson但务必使用最新版本并严格关闭或管理AutoType。追求代码简洁和可读性或项目大量使用Google系库Gson是个非常稳妥优雅的选择。需要频繁动态构建和修改JSON结构Fastjson的JSONObject和Gson的JsonObject的API在这种场景下可能更顺手一些。注意无论选择哪个库强烈建议在项目内进行统一。混合使用不同库的JSON对象会导致混乱的依赖和转换代码。3. 核心API详解与高效使用姿势我们以最常用的Fastjson的JSONObject为例拆解其核心操作。理解了这些切换到其他库也能触类旁通。3.1 创建与构建不止一种方式1. 全新创建空对象JSONObject obj new JSONObject();这是最直接的方式得到一个空的JSONObject相当于{}。2. 从Map构造MapString, Object map new HashMap(); map.put(key1, value1); map.put(key2, 100); JSONObject obj new JSONObject(map);当你已经有一个数据Map时用这个构造器非常方便。但要注意JSONObject内部会引用或复制这个Map取决于实现修改JSONObject可能会影响原Map反之亦然这点需要查证具体版本的文档。3. 直接解析字符串最常用String jsonStr {\name\:\李四\, \active\:true}; JSONObject obj JSON.parseObject(jsonStr); // Fastjson方式 // Gson: JsonObject obj JsonParser.parseString(jsonStr).getAsJsonObject(); // Jackson: JsonNode rootNode objectMapper.readTree(jsonStr); // 得到的是JsonNode这是将网络响应或文件内容变成可操作对象的入口。JSON.parseObject()是Fastjson的核心静态方法。4. 链式PUT构建推荐JSONObject user new JSONObject() .fluentPut(id, 1) // fluentPut方法支持链式调用 .fluentPut(username, zhangsan) .fluentPut(profile, new JSONObject().fluentPut(email, testexample.com));使用fluentPutFastjson或类似链式方法可以让构建多层嵌套的JSON代码看起来非常清晰避免了obj.put(...); obj.put(...);的重复前缀。3.2 数据读取与类型安全获取读取数据是JSONObject最频繁的操作这里隐藏的坑最多。基础get方法返回ObjectObject value obj.get(key);这是最原始的方法返回的是Object类型。你几乎总是需要将它强制转换为你期望的类型不安全不推荐直接使用。类型安全的getXxx方法推荐String name obj.getString(name); Integer age obj.getInteger(age); // 如果对应值是数字会尝试转换为Integer Long bigNumber obj.getLong(bigNumber); Boolean active obj.getBoolean(active); JSONObject address obj.getJSONObject(address); // 获取嵌套对象 JSONArray hobbies obj.getJSONArray(hobbies); // 获取数组这些方法内部会做类型检查和转换。如果键不存在它们通常返回null。但这里有个巨大陷阱如果键存在但值类型不匹配比如你想用getString取一个数字Fastjson会尝试转换如数字123转成字符串“123”而Gson可能会直接抛出ClassCastException。所以不能完全依赖库的自动转换。带默认值的get方法// Fastjson 提供了getXxx(key, defaultValue)的重载非常实用 String nickname obj.getString(nickname, 未知); // 如果nickname不存在或为null返回“未知” int score obj.getIntValue(score, 0); // 返回基本类型int避免NullPointerException这是防止空指针和提供缺省值的利器在构建健壮性代码时务必多用。路径查询Fastjson特性// 假设有复杂JSON: {user:{profile:{city:Beijing}}} String city ((JSONObject)obj.get(user)).get(profile).get(city); // 传统方式冗长且不安全 // Fastjson 支持路径查询 String cityPath obj.getString(user.profile.city); // 直接通过点号路径获取路径查询能极大简化对深层嵌套数据的访问但需注意如果中间路径任何一环为null或不是JSONObject则会返回null。3.3 序列化与输出控制将JSONObject变回字符串通常很简单String jsonString obj.toJSONString();但这里面的门道在于格式化和特性控制。美化输出格式化String prettyJsonString JSON.toJSONString(obj, SerializerFeature.PrettyFormat);这在调试、日志输出或者生成给人看的配置文件时非常有用。SerializerFeature.PrettyFormat会让JSON字符串包含缩进和换行。控制序列化特性Fastjson的SerializerFeature提供了很多选项WriteMapNullValue是否输出值为null的字段。默认是不输出这是很多人的疑惑点觉得数据丢了。WriteNullStringAsEmpty将null字符串字段输出为。WriteDateUseDateFormat使用指定的日期格式序列化Date对象。DisableCircularReferenceDetect禁用循环引用检测。在对象存在相互引用时默认会通过$ref来避免栈溢出但有时我们需要完整的对象。例如我们希望输出所有字段即使为nullString withNulls JSON.toJSONString(obj, SerializerFeature.WriteMapNullValue);日期格式的处理日期是序列化的一大痛点。默认情况下Fastjson会将Date序列化为时间戳毫秒数。这通常不是前端想要的标准格式。// 方案1全局设置默认日期格式在应用初始化时设置一次 JSON.DEFFAULT_DATE_FORMAT “yyyy-MM-dd HH:mm:ss”; // 方案2在单次序列化时指定 String jsonWithDate JSON.toJSONStringWithDateFormat(obj, “yyyy-MM-dd”); // 方案3使用JSONField注解在实体类字段上指定格式当JSONObject由POJO转换而来时有效实操心得对于API开发建议统一日期格式如yyyy-MM-dd’T’HH:mm:ss.SSS’Z’并在全局或注解层面进行配置避免在每个序列化点写死格式。4. 高级应用场景与性能优化4.1 复杂结构处理嵌套与数组真实世界的JSON很少是扁平结构。处理嵌套对象就是不断地getJSONObject和put。// 构建 JSONObject order new JSONObject(); order.put(“orderId”, “12345”); JSONObject customer new JSONObject(); customer.put(“name”, “王五”); customer.put(“phone”, “13800138000”); order.put(“customer”, customer); // 嵌套进去 // 解析 JSONObject parsedOrder JSON.parseObject(orderJsonStr); String customerName parsedOrder.getJSONObject(“customer”).getString(“name”);处理JSONArrayJSONArray可以看作ListObject的封装里面可以放基本类型、JSONObject或其他JSONArray。// 构建数组 JSONArray tags new JSONArray(); tags.add(“电子产品”); tags.add(“促销”); obj.put(“tags”, tags); // 遍历数组 JSONArray parsedTags obj.getJSONArray(“tags”); if (parsedTags ! null) { for (int i 0; i parsedTags.size(); i) { String tag parsedTags.getString(i); // 获取数组元素 // 或者如果是对象数组JSONObject item parsedTags.getJSONObject(i); } } // Java 8 流式处理需先转为List ListString tagList parsedTags.toJavaList(String.class); tagList.stream().forEach(System.out::println);4.2 与Java BeanPOJO的互转这是JSONObject更强大的能力——作为动态对象和静态POJO之间的桥梁。JSON字符串/JSONObject 转 POJO// Fastjson User user JSON.parseObject(jsonString, User.class); // 或者从JSONObject转换 User user obj.toJavaObject(User.class); // Gson User user gson.fromJson(jsonString, User.class); // Jackson User user objectMapper.readValue(jsonString, User.class);这要求User类有无参构造器并且字段名能与JSON的key匹配或通过注解映射如Fastjson的JSONField(name “user_name”) Jackson的JsonProperty。POJO 转 JSONObject// Fastjson User user new User(“赵六”, 30); JSONObject obj (JSONObject) JSON.toJSON(user); // 注意toJSON返回的是Object需要强转 // Gson JsonObject obj gson.toJsonTree(user).getAsJsonObject(); // 先转为JsonElement // Jackson JsonNode node objectMapper.valueToTree(user); // 转为JsonNode树模型这种方式在你需要基于一个已知对象动态添加或修改一些字段时非常有用。4.3 性能优化与内存考量避免频繁解析/序列化大JSON对于大的JSON文本反复调用JSON.parseObject()和toJSONString()是CPU密集型操作。如果数据不变应缓存解析后的JSONObject如果只是修改其中一小部分尽量在对象层面操作最后再一次性序列化。使用指定类型的parseObject如果你最终目标是将JSON转化为POJO直接使用JSON.parseObject(text, User.class)这比先解析成JSONObject再调用toJavaObject效率更高因为减少了一次中间对象的创建和转换。注意JSONObject的内存占用JSONObject内部通常是基于HashMap实现的对于海量小对象的JSON数据内存开销会比纯POJO大。在内存敏感的场景如手机端、高频服务需要评估是否可以直接使用POJO绑定。复用ObjectMapper/Gson实例对于Jackson和Gson其核心类ObjectMapper,Gson是线程安全的且构造成本较高。务必在应用生命周期内复用单例而不是每次使用都new一个。5. 避坑指南与常见问题排查在实际开发中和JSONObject打交道总会遇到一些让人头疼的问题。这里记录几个典型的“坑”和解决方法。5.1 空指针异常NullPointerException这是最常见的问题通常发生在链式调用或直接获取值时。场景1路径中某一级为null// 错误示例如果obj里没有user这个key或者user的值不是JSONObject这里会NPE String city obj.getJSONObject(“user”).getJSONObject(“profile”).getString(“city”);解决逐级判断或使用带默认值的get方法或利用Fastjson的路径表达式但需知悉其返回null的特性。// 稳妥写法 JSONObject user obj.getJSONObject(“user”); if (user ! null) { JSONObject profile user.getJSONObject(“profile”); if (profile ! null) { city profile.getString(“city”, “N/A”); } } // 或者使用Optional进行链式保护Java 8 city Optional.ofNullable(obj.getJSONObject(“user”)) .map(u - u.getJSONObject(“profile”)) .map(p - p.getString(“city”)) .orElse(“N/A”);场景2getXxx返回null后直接使用int age obj.getInteger(“age”); // 如果“age”不存在返回null int calculated age 10; // 如果age为null拆箱时抛出NPE解决使用getIntValue(“age”, 0)或者对返回值进行判空。5.2 日期序列化格式混乱如前所述日期格式是个大坑。除了统一配置还要注意时区问题。服务器可能是UTC时间而前端显示需要本地时间。在序列化时确保SimpleDateFormat或库的日期格式化器设置了正确的时区。5.3 特殊字符与转义问题JSON字符串中的双引号、换行符、反斜杠等都需要转义。JSONObject的toString()方法会自动处理。但如果你是自己拼接字符串然后解析就很容易出错。// 错误示例 String badJson “{“name”:”带”引号”的名字”}”; // 字符串内的引号破坏了结构 // 正确应该由JSONObject构建或手动转义 String goodJson “{“name”:”带\”引号\”的名字”}”;技巧永远不要手动拼接复杂的JSON字符串。用JSONObject和JSONArray来构建。5.4 循环引用导致栈溢出当两个Java对象相互引用并试图序列化成JSON时就会发生循环引用。class A { B b; } class B { A a; } A a new A(); B b new B(); a.b b; b.a a; JSON.toJSONString(a); // 可能导致栈溢出或生成包含$ref的JSON解决使用注解在其中一个对象的引用字段上使用JSONField(serialize false)Fastjson或JsonIgnoreJackson忽略该字段的序列化。使用特性Fastjson默认会启用SerializerFeature.DisableCircularReferenceDetect吗不默认是启用了循环引用检测会生成{“$ref”:”$”}这样的引用标识。如果你需要完整的对象树可以禁用此特性DisableCircularReferenceDetect但要确保你的对象图没有真正的循环否则会无限递归。5.5 大小写与命名风格差异Java字段通常使用驼峰命名userName而JSON的key可能使用下划线user_name或其它风格。这种不一致会导致转换失败。解决使用库提供的注解进行映射。Fastjson:JSONField(name “user_name”)Jackson:JsonProperty(“user_name”)Gson: 可以使用SerializedName(“user_name”)也可以在全局配置中设置命名策略如Jackson的PropertyNamingStrategy.SNAKE_CASE。5.6 泛型类型的反序列化当你需要解析像ListUser这样的泛型集合时直接使用JSON.parseObject会丢失泛型信息。// 错误这样得到的是ListObject而不是ListUser ListUser users JSON.parseObject(jsonArrayStr, List.class);解决使用TypeReferenceJackson/Gson或TypeFastjson来传递完整的泛型类型。// Fastjson ListUser users JSON.parseObject(jsonArrayStr, new TypeReferenceListUser() {}.getType()); // Jackson ListUser users objectMapper.readValue(jsonArrayStr, new TypeReferenceListUser() {}); // Gson Type userListType new TypeTokenListUser(){}.getType(); ListUser users gson.fromJson(jsonArrayStr, userListType);JSONObject就像一把瑞士军刀看似简单但用精了能解决大部分数据表示和交换的问题。关键是要理解它背后的原理知道不同库的脾气并在实践中积累应对各种边界情况的经验。从简单的键值对存取到复杂的POJO映射和性能调优每一步都关乎代码的质量和系统的稳定性。希望这些从实际项目里摸爬滚打出来的经验能让你下次再面对那串花括号和引号时心里更有底。

相关新闻

正则表达式核心语法与Python实战:从模式匹配到高效文本处理

正则表达式核心语法与Python实战:从模式匹配到高效文本处理

1. 从“字符串匹配”到“模式思维”:为什么正则表达式是程序员的必修课如果你写过代码,处理过文本,那你一定遇到过这样的场景:从一堆日志里提取IP地址,验证用户输入的邮箱格式是否正确,或者把一段HTML里的所…

2026/8/14 8:51:06 阅读更多 →
GARbro高级技巧:自定义资源提取与格式转换

GARbro高级技巧:自定义资源提取与格式转换

GARbro高级技巧:自定义资源提取与格式转换 【免费下载链接】GARbro Visual Novels resource browser 项目地址: https://gitcode.com/gh_mirrors/gar/GARbro GARbro作为一款专业的Visual Novels资源浏览器,提供了强大的自定义资源提取与格式转换功…

2026/8/14 8:51:06 阅读更多 →
2026英语单词学习工具选型指南:核心痛点、技术方案与天学网落地实践

2026英语单词学习工具选型指南:核心痛点、技术方案与天学网落地实践

【摘要】本文结合2026年英语教育行业调研数据,拆解英语单词学习工具的核心选型标准与技术方案,重点分析天学网智能适配型工具在公立校的落地效果,为学生和教师提供适配选型参考,助力提升单词学习效率和英语成绩。一、英语单词学习…

2026/8/14 8:51:06 阅读更多 →

最新新闻

Navicat试用期重置完整指南:3个免费方案让Mac版Navicat无限试用

Navicat试用期重置完整指南:3个免费方案让Mac版Navicat无限试用

Navicat试用期重置完整指南:3个免费方案让Mac版Navicat无限试用 【免费下载链接】navicat_reset_mac navicat mac版无限重置试用期脚本 Navicat Mac Version Unlimited Trial Reset Script 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_mac n…

2026/8/14 12:02:38 阅读更多 →
FFmpeg实战:从原理到实践,打造动画游戏视频4K超分辨率处理方案

FFmpeg实战:从原理到实践,打造动画游戏视频4K超分辨率处理方案

在视频处理领域,将低分辨率视频(尤其是动画、游戏录像)提升至4K分辨率的需求日益增长。传统的“古法”放大方法,如简单的双线性或双三次插值,虽然操作简单,但往往导致画面模糊、细节丢失,在《我…

2026/8/14 12:02:38 阅读更多 →
还在为抖音视频带水印发愁?3分钟上手douyin-downloader批量下载工具

还在为抖音视频带水印发愁?3分钟上手douyin-downloader批量下载工具

还在为抖音视频带水印发愁?3分钟上手douyin-downloader批量下载工具 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser f…

2026/8/14 12:02:38 阅读更多 →
AI视频漫剧制作全流程:从文字到视频的自动化创作指南

AI视频漫剧制作全流程:从文字到视频的自动化创作指南

1. 先搞清楚“AI视频漫剧”到底在做什么,以及它适合谁如果你最近在关注AI视频制作,尤其是那种带点漫画、动画风格的短片,可能会被“AI视频漫剧”、“AI短片”这些词吸引。很多人觉得这很神秘,或者以为需要很高的技术门槛。其实&am…

2026/8/14 12:02:38 阅读更多 →
开源电影级AI视频提示词库:从专业分镜到批量生产实战指南

开源电影级AI视频提示词库:从专业分镜到批量生产实战指南

1. 先搞清楚这个“电影级Prompt库”到底能帮你做什么如果你正在找能直接拿来用的、高质量的AI视频生成提示词,特别是想做出有电影感的分镜,那这个开源项目值得你花时间研究一下。它不是一个视频生成模型,而是一个精心整理的专业分镜提示词库&…

2026/8/14 12:02:38 阅读更多 →
Mac硬盘一插就变“只读“?这套免费NTFS读写方案帮你彻底解围

Mac硬盘一插就变“只读“?这套免费NTFS读写方案帮你彻底解围

Mac硬盘一插就变"只读"?这套免费NTFS读写方案帮你彻底解围 【免费下载链接】Free-NTFS-for-Mac Nigate: An open-source NTFS utility for Mac. It supports all Mac models (Intel and Apple Silicon), providing full read-write access, mounting, and…

2026/8/14 12:01:37 阅读更多 →

日新闻

临沂网站建设铭镇:深耕本土数字生态,以匠心铸就企业品牌核心竞争力

临沂网站建设铭镇:深耕本土数字生态,以匠心铸就企业品牌核心竞争力

在这个流量为王、视觉至上的互联网时代,对于临沂乃至整个山东乃至全国的传统中小企业来说,拥有一张精美的“数字名片”早已不再是可选项,而是生存的必答题。每当夜幕降临,沂河两岸灯火辉煌,物流之都的喧嚣逐渐沉淀为对未来的思考。我们常常听到老板们在茶余饭后探讨:为什…

2026/8/14 0:00:26 阅读更多 →
Flutter与OpenHarmony实现剧本杀组队表单开发实战

Flutter与OpenHarmony实现剧本杀组队表单开发实战

1. 项目概述在移动应用开发领域,跨平台框架Flutter因其高效的开发体验和出色的性能表现,已经成为众多开发者的首选。而OpenHarmony作为新兴的操作系统平台,其开放性和灵活性为开发者提供了全新的可能性。本文将聚焦于一个实际应用场景——剧本…

2026/8/14 0:00:26 阅读更多 →
大连网站建设找简维科技:为您打造懂业务更懂用户的数字化转型引擎

大连网站建设找简维科技:为您打造懂业务更懂用户的数字化转型引擎

在这个数字化浪潮席卷全球的今天,企业想要在激烈的市场竞争中站稳脚跟,拥有一张好看的“数字名片”已经远远不够了。很多老板在刚开始接触互联网业务时,都有一个共同的困惑:为什么我花了钱建的网站,就像是在真空中自嗨?访客进来转了两圈就跑了,线索石沉大海,甚至连客服…

2026/8/14 0:01:27 阅读更多 →

周新闻

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/13 10:41:52 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

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

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

2026/8/13 10:41:51 阅读更多 →

月新闻

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

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

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

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

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

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

2026/8/13 10:41:49 阅读更多 →
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/13 10:41:49 阅读更多 →