Jackson反序列化类型不匹配:从START_OBJECT到String的解析错误详解
1. 问题现场一个典型的JSON解析“车祸现场”如果你在用Java处理JSON数据尤其是和Spring Boot、微服务或者任何前后端交互打交道那么“Cannot deserialize instance ofjava.lang.Stringout of START_OBJECT token”这个错误大概率是你开发生涯中迟早要遇到的“老朋友”。我第一次碰到它时正赶着上线一个用户配置同步接口前端传过来的JSON看着无比正常但服务端日志里突然蹦出这一行红字整个解析流程瞬间崩溃。这感觉就像你收到一个包装精美的礼物盒拆开一层又一层最后发现里面装的不是巧克力而是一个需要你再拆一次的小盒子而你的程序只准备了接收巧克力的手。这个错误的核心在于“类型不匹配”而且是反序列化从JSON字符串转换成Java对象过程中的类型不匹配。Jackson作为Java生态里最主流的JSON处理库它就像一个严格的翻译官。当你告诉它“请把这段JSON翻译成一个String类型的Java变量”而它却发现JSON对应位置是一个{即START_OBJECTtoken表示一个JSON对象的开始时它就懵了然后果断抛出这个异常。它无法理解为什么你指明要一个简单的字符串但数据却是一个复杂的、可能包含多个键值对的对象结构。这不仅仅是Jackson的问题更是前后端契约、数据模型设计乃至团队协作默契的试金石。错误本身很直接但背后隐藏的原因却五花八门可能是API文档过时了可能是某个字段的类型在迭代中被悄悄改变了也可能是在复杂的数据嵌套中泛型擦除导致了类型信息的丢失。接下来我们就从根儿上拆解这个问题不仅告诉你如何快速修复更让你理解如何从根本上避免它。2. 错误根源深度剖析Jackson的“翻译”规则要彻底解决这个问题我们必须先理解Jackson是如何工作的。它进行反序列化时依赖两大关键信息目标Java类的定义Class Metadata和待解析的JSON数据结构。错误就发生在这两者的预期出现严重偏差时。2.1 什么是START_OBJECTtoken在JSON的语法里数据结构是通过特定的“令牌”Token来界定的。Jackson解析器会逐个读取这些令牌START_OBJECT({)表示一个JSON对象的开始。END_OBJECT(})表示一个JSON对象的结束。START_ARRAY([)表示一个JSON数组的开始。VALUE_STRING(xxx)表示一个字符串值。VALUE_NUMBER表示一个数字值。VALUE_TRUE/VALUE_FALSE表示布尔值。VALUE_NULL表示null。所以当错误信息说“out of START_OBJECT token”它是在非常精确地告诉你“我当前读到了一个{这意味着接下来应该是一个对象但你却让我把这个对象整个当成一个String来解析这办不到。”2.2 典型场景还原与代码示例让我们通过几个最常见的代码场景来直观感受错误是如何发生的。场景一最简单的字段类型不匹配假设我们有一个简单的Java类User用于接收用户信息public class User { private String name; private String address; // 预期这里是一个字符串例如“北京市海淀区” // 省略getter/setter }后端接口期望的JSON是{ name: 张三, address: 北京市海淀区科技园路1号 }这没问题address对应一个JSON字符串。但是如果前端或上游服务传入了嵌套结构的地址信息{ name: 张三, address: { province: 北京, city: 北京市, district: 海淀区, detail: 科技园路1号 } }此时Jackson解析到address字段时发现令牌是START_OBJECT({)而目标类型是String。冲突发生错误抛出Cannot deserialize instance ofjava.lang.Stringout of START_OBJECT token。场景二集合或Map中的泛型信息丢失这是一个更隐蔽的场景尤其在方法参数中。假设有一个接收Map的接口PostMapping(/updateSettings) public void updateSettings(RequestBody MapString, String settings) { // 业务逻辑 }代码意图很清晰希望得到一个键和值都是String的Map。如果传入{ theme: dark, notification: true }解析notification字段时Map的Value类型预期是String但实际收到的true是一个布尔值VALUE_TRUEtoken。这会导致类似的错误虽然信息可能略有不同但根源一致。更棘手的是泛型擦除。如果你在另一个类中有一个MapString, String类型的成员变量在运行时由于Java泛型擦除Jackson有时可能无法精确知道Value应该是String从而在遇到对象时误判。场景三多态类型处理JsonTypeInfo配置不当当使用Jackson的多态反序列化特性时比如用JsonTypeInfo注解来处理子类如果JSON中的类型标识与预期不符或者反序列化时找不到合适的子类也可能引发底层类型转换错误有时会以这个错误的形式表现出来。3. 诊断与排查实战指南当错误发生时不要慌张。一套系统的排查流程能帮你快速定位问题。3.1 第一步审查JSON数据与Java模型这是最直接的一步。将报错时使用的原始JSON字符串打印或记录下来。你可以通过拦截请求的过滤器Filter、拦截器Interceptor或者直接在Controller方法中打印HttpServletRequest的输入流来获取。拿到原始JSON后使用在线的JSON格式化工具如 json.cn进行美化使其具有清晰的缩进。然后逐字段对比JSON结构和你的Java实体类DTO/VO。定位出错字段错误信息通常会告诉你出错的字段路径例如com.example.User.address。如果没有Jackson的默认异常信息会包含完整的“引用链”。对比类型找到这个字段在JSON中的实际结构。它是一个带花括号{}的对象还是一个方括号[]的数组在Java类中它被定义成了什么类型String、自定义对象、List还是Map检查嵌套如果字段在Java中是一个自定义对象检查这个对象内部的字段定义是否又能和JSON的子对象匹配上。不匹配会层层向上抛出错误。3.2 第二步验证序列化/反序列化逻辑的一致性这个问题常常发生在“双向通信”中。确保序列化Java对象转JSON和反序列化JSON转Java对象使用的是同一套逻辑或兼容的模型。场景你修改了某个实体类将String address改成了Address address一个自定义类并更新了序列化此对象的接口A。但是接口B可能是一个旧接口或由其他服务调用仍然在接收JSON并且其接收模型未同步更新还是旧的String address。这时调用接口B就会报错。对策对于公开的API模型变更需要谨慎考虑版本兼容性。可以通过添加JsonIgnoreProperties(ignoreUnknown true)注解来忽略未知字段但这治标不治本关键字段不匹配依然会出错。3.3 第三步利用Jackson的ObjectMapper进行手动测试在单元测试或一个简单的main方法中隔离问题是最有效的。使用你的ObjectMapper实例注意配置需与生产环境一致如忽略未知字段、日期格式等进行手动反序列化。ObjectMapper mapper new ObjectMapper(); // 可能的生产环境配置 mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); mapper.setDateFormat(new SimpleDateFormat(yyyy-MM-dd HH:mm:ss)); String jsonString {\name\:\张三\,\address\:{\city\:\北京\}}; try { User user mapper.readValue(jsonString, User.class); System.out.println(成功: user); } catch (JsonProcessingException e) { System.out.println(失败: e.getMessage()); e.printStackTrace(); // 打印完整堆栈定位更精确 }通过手动测试你可以快速确认是否是数据问题还是环境配置问题。3.4 第四步检查框架配置与注解Spring Boot对Jackson有自动配置但自定义配置可能会覆盖默认行为。检查你的项目配置application.properties/yml中是否有关于Jackson的配置如spring.jackson.deserialization.fail-on-unknown-properties。是否定义了全局的ObjectMapperBean其配置是否与当前反序列化场景冲突在实体类字段上是否使用了Jackson注解如JsonProperty、JsonFormat、JsonDeserialize这些注解可能会改变字段的预期类型。例如一个JsonDeserialize(using CustomStringDeserializer.class)注解如果CustomStringDeserializer实现有误也可能导致此问题。4. 解决方案与代码修复诊断出原因后解决方案通常很明确。以下是针对不同场景的修复策略。4.1 方案一修正Java模型推荐如果JSON数据结构是权威的、不可变更的例如来自稳定的第三方API那么你应该修正你的Java模型去适应它。对于场景一将User类的address字段类型从String改为一个专用的Address类。public class User { private String name; private Address address; // 改为自定义对象类型 // getter/setter } public class Address { private String province; private String city; private String district; private String detail; // getter/setter }这是最根本、最清晰的解决方案保持了类型安全性和代码的可读性。4.2 方案二自定义反序列化器JsonDeserialize如果JSON结构复杂多变或者你需要在反序列化时进行一些特殊的逻辑处理比如将那个地址对象压缩成一个用逗号分隔的字符串可以使用自定义反序列化器。public class User { private String name; JsonDeserialize(using AddressToStringDeserializer.class) private String address; // getter/setter } public class AddressToStringDeserializer extends StdDeserializerString { public AddressToStringDeserializer() { super(String.class); } Override public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { // 如果当前令牌是字符串直接读取 if (p.currentToken() JsonToken.VALUE_STRING) { return p.getText(); } // 如果当前令牌是对象则按我们的逻辑处理 if (p.currentToken() JsonToken.START_OBJECT) { // 将整个对象树读为一个JsonNode JsonNode node p.getCodec().readTree(p); // 假设我们想拼接成“省-市-区-详情”的格式 String province node.has(province) ? node.get(province).asText() : ; String city node.has(city) ? node.get(city).asText() : ; // ... 拼接逻辑 return String.format(%s%s%s%s, province, city, ...); } // 其他类型可以抛出异常或返回null return null; } }这种方法非常灵活但增加了代码的复杂性适用于有特殊业务规则的场景。4.3 方案三使用更宽松的接收类型如果前端传的数据结构不确定或者你只是想先接收下来再处理可以考虑使用更通用的类型。使用Object或JsonNodepublic class User { private String name; private Object address; // 或者 com.fasterxml.jackson.databind.JsonNode // getter/setter }这样无论address是字符串还是对象Jackson都能成功反序列化。后续在业务代码中你需要通过instanceof检查其实际类型再进行操作。这种方式牺牲了编译时的类型安全换取了运行时的灵活性。使用MapString, Objectpublic class User { private String name; private MapString, Object address; // getter/setter }这明确表示address是一个键值对集合。你可以直接通过address.get(“city”)来获取值但取出的值也是Object类型需要手动转换。4.4 方案四配置ObjectMapper的容错性通过配置ObjectMapper可以改变其默认的严格行为。FAIL_ON_UNKNOWN_PROPERTIES设置为false可以忽略JSON中存在而Java类中没有的字段但这无法解决类型不匹配的核心错误。对于StringvsObject这种根本性冲突忽略未知属性不起作用。ACCEPT_EMPTY_STRING_AS_NULL_OBJECT这个配置主要处理空字符串不适用于对象转字符串的场景。自定义DeserializationProblemHandler这是一个更高级的处理器可以拦截反序列化过程中的各种问题包括类型不匹配。你可以在处理器中尝试进行补救例如记录日志、返回默认值等。但这通常作为最后一道防线而不是首选方案。重要提示全局配置ObjectMapper会影响整个应用需谨慎评估。通常建议在具体的字段或类上使用注解进行精细控制。5. 进阶复杂场景与泛型擦除的应对5.1 处理泛型集合的类型擦除问题当你的类中有ListT或MapK, V这样的泛型字段时Jackson在运行时可能无法获取T、V的具体类型。为了解决这个问题你有两种主要方式使用TypeReference在手动调用ObjectMapper.readValue()时使用TypeReference来保留完整的泛型信息。ObjectMapper mapper new ObjectMapper(); String json [{\name\:\张三\}, {\name\:\李四\}]; ListUser userList mapper.readValue(json, new TypeReferenceListUser() {});这种方式在反序列化根对象或明确知道类型时非常有效。在类定义中提供类型信息对于作为成员变量的泛型集合Jackson提供了JsonDeserialize注解来指定内容类型。public class ResponseWrapper { private String status; JsonDeserialize(contentAs User.class) private ListUser data; // 明确告知Jackson List中的内容是User类型 // getter/setter }或者如果集合类型非常复杂可以使用JsonDeserialize(contentUsing CustomDeserializer.class)指定一个完全自定义的反序列化器。5.2 多态类型处理的正确姿势使用JsonTypeInfo和JsonSubTypes处理继承体系时务必确保JSON中的类型标识如type或class字段与注解配置完全匹配并且对应的子类在类路径下可用。类型标识不匹配或子类缺失会导致Jackson尝试用基类去反序列化一个子类特有的数据结构极易引发类型转换错误其表现形式之一就是本文讨论的错误。6. 预防措施与最佳实践与其在报错后焦头烂额不如在设计和开发阶段就建立防线。定义并维护清晰的API契约使用OpenAPI (Swagger) 或类似工具定义接口的请求/响应模型。前后端或服务间基于此契约开发能极大减少数据格式不一致的问题。契约变更应有明确的流程和版本管理。编写健壮的单元测试为每个重要的DTO和Controller方法编写单元测试覆盖正常情况和各种边界情况如字段缺失、字段为null、字段类型错误。使用JsonTest可以方便地测试Jackson的序列化/反序列化行为。在关键反序列化处添加防御性代码对于来自外部系统的不完全可信的数据可以在反序列化外层使用try-catch捕获JsonProcessingException或更具体的MismatchedInputException并转换为业务友好的错误信息返回给调用方而不是让服务直接崩溃。谨慎使用JsonIgnoreProperties(ignoreUnknown true)这个注解可以防止因为JSON中有额外字段而报错但它会隐藏数据模型不匹配的早期警告。建议仅在对接无法控制的第三方API或用于向后兼容的扩展字段时使用。统一ObjectMapper配置在团队或项目中尽量统一ObjectMapper的配置如日期格式、是否忽略未知属性等避免因配置不同导致序列化和反序列化行为不一致。在Spring Boot中可以通过定义一个Jackson2ObjectMapperBuilderCustomizerBean来定制全局配置。7. 常见问题排查速查表为了方便你快速定位这里将常见原因和解决方向整理成表格现象/错误线索可能原因排查方向与解决思路错误明确指向某个具体字段如User.address该字段的Java类型与JSON数据结构严重不匹配如String vs Object。1. 对比该字段在JSON中的实际结构用格式化工具。2. 修正Java类中的字段类型或使用JsonDeserialize自定义解析逻辑。错误发生在MapString, String的Value解析时Map的Value预期是String但JSON中对应值是其他类型Boolean, Number, Object。1. 检查传入JSON的键值对类型。2. 将Map类型改为MapString, Object或在业务逻辑中处理类型转换。错误发生在ListT或泛型字段运行时泛型擦除Jackson无法确定T的具体类型。1. 使用TypeReference进行手动反序列化。2. 在字段上使用JsonDeserialize(contentAs...)注解指明具体类型。错误信息中包含多态类型标识如typeJsonTypeInfo配置的多态反序列化失败子类不匹配或缺失。1. 检查JSON中的类型标识值是否正确。2. 确保JsonSubTypes注解包含了所有可能的子类且类路径可用。仅在某些特定环境测试/生产报错不同环境的ObjectMapper配置可能不同如通过Spring Profile加载不同配置。1. 检查各环境的应用配置文件。2. 检查是否有环境特定的配置类影响了Jackson的行为。错误间歇性发生数据看似正常可能存在线程安全问题多个线程共享并修改了同一个ObjectMapper实例的配置。确保ObjectMapper实例是线程安全的或者每次使用都创建新的实例性能较差。在Spring中通常注入的ObjectMapperBean是配置好且线程安全的。遇到“Cannot deserialize instance ofjava.lang.Stringout of START_OBJECT token”这个错误本质上是在提醒我们数据契约出现了裂缝。在分布式系统和前后端分离的架构下数据格式就是服务之间、团队之间沟通的语言。每一次反序列化错误都是一次对接口严谨性、代码健壮性和团队协作的考验。我的经验是在模型设计初期多花一分钟思考兼容性和扩展性在代码中多写一行防御性的校验或清晰的注解就能在后期运维中省下无数个小时的排查时间。记住Jackson是一个强大的工具但它需要清晰、准确的指令才能正确工作。给你的数据模型穿上合适的“类型盔甲”才能让它在复杂的网络通信中安然无恙。

相关新闻

AI写论文靠谱吗?2026年学长实测的正确打开方式

AI写论文靠谱吗?2026年学长实测的正确打开方式

「AI写论文」这个词在2026年的搜索量比三年前翻了十几倍,但学生的态度依然分裂:有人全靠AI一周搞定初稿,有人闻AI色变、碰都不敢碰。真相在中间:AI写论文靠不靠谱,不取决于工具,而取决于你怎么用。用错了是…

2026/8/1 4:48:35 阅读更多 →
毕业论文写作流程全拆解:2026年从选题到定稿的6个步骤

毕业论文写作流程全拆解:2026年从选题到定稿的6个步骤

打开空白文档,盯着「毕业论文」四个字发呆两小时——如果你正在经历这种状态,别担心,你不是一个人。毕业论文写作难的不是写,而是没人告诉你完整的流程长什么样:什么时候选题、开题报告怎么写、文献综述和正文的顺序是…

2026/8/1 4:48:35 阅读更多 →
AI生成内容强制标识:短视频和广告行业的变革与挑战

AI生成内容强制标识:短视频和广告行业的变革与挑战

监管浪潮来袭:AI内容标识成全球共识2024年以来,全球主要经济体密集出台AI内容监管政策。欧盟《人工智能法案》明确要求生成式AI内容必须标注,违规者最高面临全球营业额6%的罚款;中国网信办发布《生成式人工智能服务管理暂行办法》…

2026/8/1 4:48:35 阅读更多 →

最新新闻

Allegro PCB设计:彻底掌握env文件配置与快捷键自定义

Allegro PCB设计:彻底掌握env文件配置与快捷键自定义

1. 从“玄学”到掌控:为什么你的Allegro快捷键总是不对劲?如果你用过一段时间的Cadence Allegro,大概率遇到过这种“玄学”时刻:明明昨天还好好的快捷键,今天打开软件突然就失效了;或者,你从同事…

2026/8/1 5:34:52 阅读更多 →
非ROOT环境下Frida动态调试Android应用:重打包注入与实战指南

非ROOT环境下Frida动态调试Android应用:重打包注入与实战指南

1. 项目概述:为什么我们需要在非ROOT环境下使用Frida? 在移动安全研究、应用逆向分析或者日常的Android应用调试中,Frida几乎是一个绕不开的名字。它强大的动态插桩能力,让我们能够像外科手术一样,在应用运行时修改其…

2026/8/1 5:34:52 阅读更多 →
解锁Edge浏览器隐藏技能:免费不限次将图片公式转LaTeX/Word

解锁Edge浏览器隐藏技能:免费不限次将图片公式转LaTeX/Word

1. 项目概述:一个被忽视的浏览器“超能力”如果你经常需要处理学术论文、技术文档或者学生作业,那你一定对数学公式的输入和转换深恶痛绝。想象一下这个场景:你在网上找到一篇绝佳的论文,里面有一个复杂的公式,你想把它…

2026/8/1 5:34:52 阅读更多 →
C++数组初始化陷阱:memset全1为何导致线上故障?

C++数组初始化陷阱:memset全1为何导致线上故障?

1. 从一次诡异的线上故障说起那天下午,我正喝着咖啡,突然收到线上服务的告警,一个核心数据处理模块的CPU使用率飙升到90%以上,并且伴随着大量数据校验失败的错误日志。这个模块负责处理海量的传感器状态数据,逻辑并不复…

2026/8/1 5:34:52 阅读更多 →
Java Swing文件传输工具开发:单机版GUI文件搬运工实现详解

Java Swing文件传输工具开发:单机版GUI文件搬运工实现详解

1. 项目概述:一个桌面端的“文件搬运工”最近在整理旧电脑,发现一个挺有意思的需求:经常需要在同一台机器的不同文件夹之间,来回搬运一些零散文件。用资源管理器拖拽吧,路径深了找起来麻烦;用命令行吧&…

2026/8/1 5:34:52 阅读更多 →
南通缝纫设备采购与门店指南

南通缝纫设备采购与门店指南

南通用户采购缝纫设备的真实需求与中捷缝纫机价值 南通作为家纺与服装产业聚集地,本地服装加工厂、家纺作坊以及缝纫爱好者,在设备采购上普遍关注机型适配、稳定耐用与就近售后。中捷缝纫机(ZOJE)是面向工业与家用缝纫场景的缝纫设…

2026/8/1 5:33:52 阅读更多 →

日新闻

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

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

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

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

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

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

2026/8/1 0:00:48 阅读更多 →
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/1 0:00:48 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/31 1:03:03 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/8/1 5:19:34 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/31 4:19:39 阅读更多 →

月新闻

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

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

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

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

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

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

2026/8/1 0:00:48 阅读更多 →
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/1 0:00:48 阅读更多 →