JSON序列化注解@JSONField与@JsonProperty深度解析与避坑指南
1. 从一次线上故障说起JSON序列化引发的血案去年我们团队遇到一个线上问题一个核心的订单查询接口突然返回大量数据为null导致前端页面大面积显示异常。紧急排查日志发现服务本身运行正常数据库查询也拿到了完整数据但经过HTTP响应后字段值就神秘消失了。经过一番紧张的git bisect和日志分析最终定位到问题根源一个新上线的功能模块里某位同事为了“统一风格”将实体类中原本使用的JsonProperty注解批量替换成了JSONField但他忽略了一个关键点——我们项目的主序列化库是Jackson而JSONField是Fastjson的注解。Jackson根本不认识这个注解于是那些被标注的字段在序列化时就被默默忽略了直接导致了这次故障。这个案例让我深刻体会到在Java的JSON处理领域JSONField和JsonProperty这两个看似功能相似的注解背后却代表着两套不同的技术体系和设计哲学。用错了轻则字段映射失败重则引发线上事故。今天我就结合自己多年的踩坑经验来彻底拆解这两个注解从底层原理、使用细节到避坑指南让你不仅知道怎么用更明白为什么要这么用以及如何根据项目情况做出最合适的选择。2. 注解背后的江湖Fastjson与Jackson的派系之争要理解这两个注解必须先了解它们背后的“靠山”。这不仅仅是两个注解的对比更是Fastjson和Jackson这两个Java生态中最主流JSON库之间设计理念与实现差异的缩影。2.1 Fastjson与JSONField阿里系的性能先锋JSONField注解来自阿里巴巴开源的Fastjson库。Fastjson在国内Java开发者中拥有极高的普及度其核心卖点就是极致的速度。在很长一段时间里它在各种性能基准测试中都名列前茅。这个注解是com.alibaba.fastjson.annotation包下的成员。Fastjson的设计哲学带有很强的实用主义和“约定大于配置”的色彩。JSONField注解用起来非常灵活一个注解就能搞定序列化和反序列化过程中的多种配置。它的常见属性包括name 指定字段序列化后的JSON key名。这是最常用的属性。format 主要用于日期字段的格式化例如JSONField(format“yyyy-MM-dd HH:mm:ss”)。serialize/deserialize 布尔值分别控制该字段是否参与序列化和反序列化。这在处理敏感信息如密码或临时计算字段时非常有用。ordinal 指定字段序列化时的顺序。虽然JSON标准不要求键值对有序但某些场景下如生成固定格式的报文需要保持顺序。Fastjson的序列化/反序列化过程相对直接它通过反射读取类上的JSONField注解信息然后根据注解的配置来组装或解析JSON字符串。它的API设计对开发者非常友好很多时候一行代码JSON.toJSONString(object)就能完成转换。2.2 Jackson与JsonPropertySpring生态的默认王者JsonProperty注解则来自Fasterxml Jackson项目它是Spring Framework默认集成的JSON处理库也是国际社区和许多开源项目的首选。Jackson的特点在于功能全面、稳定可靠、扩展性极强。这个注解属于com.fasterxml.jackson.annotation包。Jackson的设计更注重规范性和可扩展性。它将序列化过程模块化核心是ObjectMapper并提供了丰富的模块如JavaTimeModule来处理各种数据类型。JsonProperty是Jackson庞大注解体系中的一员这个体系还包括JsonIgnore、JsonFormat、JsonInclude等共同构成了一个精细化的控制网络。JsonProperty的主要属性是value用于指定JSON key的名称。它控制的是双向绑定序列化和反序列化。如果你需要更精细的单向控制Jackson提供了JsonGetter和JsonSetter。对于日期格式化则需要使用专门的JsonFormat注解。Jackson的运作机制更为复杂和强大。它通过ObjectMapper注册各种序列化器Serializer和反序列化器Deserializer并利用注解信息来指导这些组件的行文。这种设计使得Jackson在处理复杂对象图、多态类型JsonTypeInfo和自定义序列化逻辑时游刃有余。2.3 核心差异对比一览表为了更直观地看清区别我将它们的关键特性整理成了下表特性维度JSONField(Fastjson)JsonProperty(Jackson)所属库FastjsonJackson包路径com.alibaba.fastjson.annotationcom.fasterxml.jackson.annotation核心功能字段别名、序列化/反序列化控制、日期格式化、顺序控制字段别名双向绑定日期格式化通过format属性直接指定需使用独立的JsonFormat注解序列化控制serialize属性需使用JsonIgnore或JsonProperty(access ...)设计哲学大而全一个注解集成多种功能强调便捷小而专功能分散到多个注解强调清晰和组合性Spring Boot默认否需手动引入依赖是spring-boot-starter-web默认包含社区与维护曾因安全漏洞频发引发信任危机目前由阿里云维护社区活跃更新稳定被众多顶级开源项目使用避坑经验一依赖隔离是生命线最危险的场景莫过于一个项目里混用了Fastjson和Jackson。比如你的Controller层使用Spring默认的Jackson进行HTTP消息转换但某个工具类或第三方SDK内部却使用了Fastjson进行对象拷贝。这时实体类上的注解就会混乱失效。最佳实践是在一个项目中明确统一使用一种JSON库。在Spring Boot项目中跟随默认选择Jackson通常是更稳妥的方案。如果必须使用Fastjson需要彻底排除Jackson并全局替换消息转换器。3. 实战中的注解应用与深度配置了解了派系我们进入实战环节。我会通过具体的代码示例展示这两个注解的常见用法并深入那些容易出错的细节。3.1 基础映射与别名功能这是注解最基础的功能解决Java字段名驼峰userId与JSON键名下划线user_id或其它命名不一致的问题。使用JSONFieldimport com.alibaba.fastjson.annotation.JSONField; public class User { // 序列化后该字段在JSON中的key为“user_id” JSONField(name user_id) private Long userId; private String name; // 省略getter/setter } // 序列化 User user new User(1L, 张三); String json com.alibaba.fastjson.JSON.toJSONString(user); // 输出: {user_id:1, name:张三}使用JsonPropertyimport com.fasterxml.jackson.annotation.JsonProperty; public class User { JsonProperty(user_id) private Long userId; private String name; // 省略getter/setter } // 序列化 (使用Jackson的ObjectMapper) ObjectMapper mapper new ObjectMapper(); String json mapper.writeValueAsString(user); // 输出: {user_id:1, name:张三}看起来很简单对吧但坑往往藏在细节里。避坑经验二Getter/Setter的优先级陷阱无论是Fastjson还是Jackson在序列化/反序列化时对字段和方法的访问策略是有优先级的。Jackson默认通过Getter/Setter方法来访问属性。这意味着如果你在字段上加了JsonProperty(“user_id”)但在对应的getter方法上又加了JsonProperty(“id”)那么最终生效的将是getter方法上的注解。这常常导致命名混乱。我的建议是保持注解位置的一致性。通常推荐将注解加在字段field上这样意图最清晰也避免了getter/setter的干扰。如果项目使用Lombok更要注意注解应放在正确的位置通常是字段上。3.2 条件序列化与敏感信息过滤我们经常遇到某些字段不需要返回给前端或者只在特定条件下才需要序列化。JSONField的精细化控制public class UserDTO { private Long id; private String username; // 该字段永远不会被序列化到JSON中 JSONField(serialize false) private String password; // 该字段可以序列化但不会从JSON反序列化到对象中用于只读字段 JSONField(deserialize false) private LocalDateTime createTime LocalDateTime.now(); // 使用format进行日期格式化 JSONField(format yyyy年MM月dd日) private LocalDateTime birthday; }JsonProperty的访问控制与JsonIgnoreJackson的方式略有不同它提供了多种组合方式。import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonInclude; public class UserDTO { private Long id; private String username; // 方式1使用 JsonIgnore 完全忽略该字段双向 JsonIgnore private String password; // 方式2使用 JsonProperty 的 access 属性进行更精细的控制 // ACCESS.READ_ONLY 表示仅可读序列化不可写反序列化 JsonProperty(access JsonProperty.Access.READ_ONLY) private LocalDateTime createTime LocalDateTime.now(); // 日期格式化需要使用独立的 JsonFormat 注解 JsonFormat(pattern yyyy年MM月dd日) private LocalDateTime birthday; // 方式3全局忽略null值不序列化到JSON JsonInclude(JsonInclude.Include.NON_NULL) private String optionalField; }注意JsonInclude可以放在类级别控制整个类的序列化包含策略。3.3 处理复杂场景嵌套对象与集合当对象中包含嵌套对象或集合时注解的行为依然有效但需要注意一些边界情况。// 一个包含嵌套和集合的订单对象 public class Order { JsonProperty(order_id) // Jackson别名 private String orderId; JSONField(name customer_info) // Fastjson别名 private Customer customer; // 嵌套对象 private ListOrderItem items; // 集合 // Customer 和 OrderItem 类内部也可以使用各自的注解 public static class Customer { JsonProperty(full_name) private String name; // ... } }在这种情况下ObjectMapper或JSON工具会递归地处理嵌套对象中的注解。但这里有一个巨大的坑循环引用。避坑经验三循环引用与栈溢出如果Order中引用了Customer而Customer中又有一个Order列表比如表示该客户的所有订单就会形成循环引用。在序列化时无论是Jackson还是Fastjson如果不加处理都会陷入无限递归最终抛出StackOverflowError。Jackson解决方案在ObjectMapper上启用SerializationFeature.FAIL_ON_EMPTY_BEANS可以快速失败但更好的方法是使用JsonIdentityInfo注解或者使用JsonManagedReference和JsonBackReference来建立父子关系切断循环。Fastjson解决方案使用JSONField(serialize false)在循环的一侧手动切断或者使用SerializerFeature.DisableCircularReferenceDetect配置不推荐可能导致数据膨胀。最根本的还是在设计DTO时避免产生循环引用使用扁平化的数据结构来传输数据。4. 当注解失效排查思路与终极解决方案即使正确使用了注解你也可能会遇到注解“失灵”的情况。别慌这通常是配置或环境问题。下面是我总结的一套排查流程。4.1 注解失效的常见症状与原因字段名未按注解改变JSON中依然是Java字段名而非注解指定的别名。字段丢失注解了JsonProperty的字段在序列化后完全消失。反序列化失败JSON数据无法正确映射到Java对象的注解字段上对象属性为null。根本原因通常如下库冲突/混用如前文所述项目依赖了多个JSON库且序列化/反序列化使用的库与注解所属库不匹配。这是最常见的原因。ObjectMapper配置被覆盖在Spring项目中如果你自定义了ObjectMapperBean但没有正确注册处理注解的模块特别是JacksonAnnotationIntrospector会导致注解失效。Getter/Setter覆盖如前所述注解加在了字段上但库的配置或默认行为是优先通过getter/setter访问而方法上没有注解。访问权限问题如果字段是private的且没有提供public的getter/setter某些配置下如FieldAccess可能无法访问。Proguard混淆在Android或某些需要代码混淆的场景下注解类名可能被混淆导致运行时无法识别。4.2 系统性排查链路当你遇到注解失效时可以按照以下步骤进行排查第一步确认运行时使用的JSON库在Spring Boot应用中查看引入的依赖。执行mvn dependency:tree或查看gradle dependencies搜索fastjson和jackson。确认你的Controller或序列化代码最终是通过哪个库进行的转换。Spring Boot的RestTemplate或WebClient默认使用Jackson。第二步检查ObjectMapper配置针对Jackson如果你自定义了ObjectMapper确保没有禁用注解处理。一个安全的最小化配置如下Configuration public class JacksonConfig { Bean public ObjectMapper objectMapper() { ObjectMapper mapper new ObjectMapper(); // 启用默认的注解扫描非常重要 mapper.configure(MapperFeature.USE_ANNOTATIONS, true); // 其他配置... mapper.registerModule(new JavaTimeModule()); // 处理Java8时间 mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); return mapper; } }第三步验证注解位置与访问器写一个简单的单元测试脱离Spring容器直接使用你认为正确的ObjectMapper或JSON工具类来序列化你的对象。如果单元测试通过但集成测试不通过说明问题在环境配置如果单元测试就失败则问题在对象本身或注解使用上。检查是否在getter/setter上存在冲突注解。第四步使用调试工具在序列化代码处打断点查看进入的到底是Jackson的writeValueAsString还是Fastjson的toJSONString。或者在Spring MVC中查看RequestMappingHandlerAdapter使用的HttpMessageConverter列表。4.3 终极方案统一与隔离经过多次踩坑我团队现在强制执行以下规范基本杜绝了此类问题技术栈统一新项目一律使用Spring Boot默认的Jackson。历史项目如果使用Fastjson则制定明确的迁移计划在过渡期严格隔离。依赖管理在父POM中对Jackson和Fastjson的依赖进行dependencyManagement明确指定版本并排除不必要的传递依赖。注解使用规范所有JSON映射注解统一放置在模型的字段Field上。禁止在同一个项目的不同模块混用两种注解。对外部API接口如Feign Client使用的DTO显式地在类上添加JsonIgnoreProperties(ignoreUnknown true)以增强兼容性。配置中心化所有对ObjectMapper的自定义配置在一个统一的Configuration类中完成避免散落各处。5. 进阶话题自定义序列化与注解的扩展当你需要超越简单的字段名映射实现更复杂的序列化逻辑时比如将一个枚举序列化为特定的code/desc对象或者对金额进行加密输出就需要用到自定义序列化器。这时两个库的扩展方式也体现了它们的设计差异。5.1 使用Jackson实现自定义序列化Jackson的自定义序列化非常优雅通过实现JsonSerializer和JsonDeserializer接口并与JsonSerialize和JsonDeserialize注解配合使用。例如我们有一个Money类希望序列化为带货币单位的字符串public class Money { private BigDecimal amount; private String currency; // getters/setters } // 自定义序列化器 public class MoneySerializer extends JsonSerializerMoney { Override public void serialize(Money value, JsonGenerator gen, SerializerProvider serializers) throws IOException { if (value null) { gen.writeNull(); } else { // 格式化为“100.00”的样式 gen.writeString(value.getCurrency() value.getAmount().setScale(2, RoundingMode.HALF_UP)); } } } // 在实体类中使用 public class Product { private String name; JsonSerialize(using MoneySerializer.class) // 指定自定义序列化器 private Money price; }对于反序列化同样可以实现JsonDeserializer并使用JsonDeserialize注解。这种方式解耦性好序列化逻辑可以复用但需要编写稍多的样板代码。5.2 使用Fastjson实现自定义序列化Fastjson提供了ObjectSerializer和ObjectDeserializer接口其使用方式与Jackson类似但绑定方式更灵活。// Fastjson 自定义序列化器 public class MoneySerializer implements ObjectSerializer { Override public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException { Money money (Money) object; if (money null) { serializer.writeNull(); return; } String str money.getCurrency() money.getAmount().setScale(2, RoundingMode.HALF_UP); serializer.write(str); } } // 使用方式1通过注解指定需要自定义注解略复杂 // 使用方式2全局注册更常见 static { ParserConfig.getGlobalInstance().putDeserializer(Money.class, new MoneyDeserializer()); SerializeConfig.getGlobalInstance().put(Money.class, new MoneySerializer()); }Fastjson的全局注册方式非常方便一次注册全局生效。但这也带来了潜在的风险如果多个模块注册了同一个类型的不同序列化器后注册的会覆盖先注册的可能引发难以调试的问题。个人体会在自定义序列化这个层面我更喜欢Jackson的注解指定方式。它将控制权交给了模型本身声明意图更清晰不会产生全局副作用。而Fastjson的全局配置虽然便捷但在大型复杂应用中隐式的全局状态往往是滋生Bug的温床。如果你的项目结构清晰、模块化做得好Fastjson的方式效率很高如果是多人协作的大型项目Jackson显式声明的哲学更能保证代码的可维护性。6. 总结与选型建议回顾JSONField和JsonProperty它们都是解决同一类问题的工具但植根于不同的生态和哲学。没有绝对的好坏只有是否适合。选择Jackson (JsonProperty) 当你项目基于Spring Boot生态。这是最自然、最省心的选择兼容性最好。需要处理复杂的序列化场景如多态类型、循环引用、自定义序列化等。Jackson的解决方案更成熟、更规范。非常关注长期维护性和社区支持。Jackson是事实上的行业标准。项目需要与大量其他使用Jackson的第三方库如数据库驱动、消息队列客户端协同工作。考虑Fastjson (JSONField) 当你遗留系统已经深度使用Fastjson且迁移成本过高。对序列化/反序列化的极致性能有非常苛刻的要求尽管在新版本中Jackson的性能差距已经很小甚至在某些场景反超。开发者熟悉其API且喜欢其“一站式”的便捷配置一个注解搞定多种事。对于全新的项目我的建议非常明确优先选择Jackson。它不仅仅是Spring的默认选项其严谨的模块化设计、强大的扩展能力和活跃的社区更能支撑应用走向复杂和成熟。而将JsonProperty及其兄弟注解用熟是每一位Java后端开发者必备的基本功。最后无论选择哪个请记住三条黄金法则一、保持技术栈统一二、理解注解背后的原理三、为复杂的序列化逻辑编写单元测试。这样你就能让JSON在Java对象与网络传输之间自由、准确、高效地流动而不再被那些突如其来的“null”值所困扰。

相关新闻

IBM Storwize V3700存储维护实战:硬盘更换、电源模块热插拔与带外管理IP配置

IBM Storwize V3700存储维护实战:硬盘更换、电源模块热插拔与带外管理IP配置

1. 项目概述:一次典型的存储设备维护实战最近在整理机房设备时,遇到一台老当益壮的IBM Storwize V3700存储阵列。这台设备虽然服役多年,但性能依然稳定,承载着一些非核心但重要的业务数据。例行巡检时,系统日志提示一块…

2026/10/10 3:22:42 阅读更多 →
AI 赋能网络欺诈的区域损失演化、群体分化风险与协同治理路径研究 —— 以威斯康星州 2026 消费调查报告为实证样本

AI 赋能网络欺诈的区域损失演化、群体分化风险与协同治理路径研究 —— 以威斯康星州 2026 消费调查报告为实证样本

摘要 生成式人工智能无约束商用带来网络欺诈工业化扩张,美国威斯康星州 2026 年消费者联盟专项调研显示,当地年度网络欺诈总损失达 14 亿美元,同比涨幅接近 15%,单户家庭平均损失超 500 美元。区域数据折射出两大核心风险分化特征…

2026/10/6 0:00:32 阅读更多 →
BLAST序列比对原理与实战:从核心算法到生物信息学应用

BLAST序列比对原理与实战:从核心算法到生物信息学应用

1. 项目概述:为什么BLAST依然是序列分析的基石在生物信息学的日常工作中,无论是鉴定一个新测序的基因功能,还是分析宏基因组数据里成千上万的未知序列,我们最常问的一个问题就是:“这段序列和谁像?” 回答这…

2026/10/3 14:10:17 阅读更多 →

最新新闻

Spring Boot图书馆座位预约系统实战:并发控制与状态机设计

Spring Boot图书馆座位预约系统实战:并发控制与状态机设计

只要在大学图书馆待过几年,对“考研季一座难求、平时座位一堆空”这种反差多半不陌生。真正的问题从来不是座位不够,而是信息不透明:哪些座位被占着、哪些被贴了书就永远“有人”、预约了又不到场的人如何处理。我去年用一个典型的 Spring Bo…

2026/10/10 3:23:16 阅读更多 →
服务、协议与端口:从端口占用到网络排障的完整指南

服务、协议与端口:从端口占用到网络排障的完整指南

真正把"服务、协议与端口"这三件事想明白,是在我一次一次被"端口被占用"按在地上摩擦之后。当时手头有个服务要起,日志里反复出现bind失败,报错就一句话:通常每个套接字地址(协议/网络地址/端口&a…

2026/10/10 3:23:16 阅读更多 →
C盘空间不足怎么办?Windows系统自带清理与磁盘管理实用技巧

C盘空间不足怎么办?Windows系统自带清理与磁盘管理实用技巧

一谈到C盘爆红,我估计十个人里有九个都皱眉头。我自己处理过不下百台电脑,也踩过不少坑,总结下来就是:清理C盘空间这件事,百分之八十的用户其实不需要安装任何第三方所谓"优化软件",光是Windows系…

2026/10/10 3:23:16 阅读更多 →
SpringBoot+Vue前后端分离图书管理系统实战:从数据库设计到部署上线

SpringBoot+Vue前后端分离图书管理系统实战:从数据库设计到部署上线

接手过不少类似“图书管理系统”的参考项目,但很多同学拿到的源码要么架构老旧,要么前后端严重耦合,跑起来一堆问题。这次分享的这套基于SpringBootVue的图书管理系统,算是我见过比较清爽、也适合拿来学习和二次开发的一套。后端用…

2026/10/10 3:23:16 阅读更多 →
PCA9422与PIC32MZ协同实现智能电源管理

PCA9422与PIC32MZ协同实现智能电源管理

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

2026/10/10 3:23:16 阅读更多 →
Java网上购物商城毕设核心设计:从SpringBoot到订单权限全解析

Java网上购物商城毕设核心设计:从SpringBoot到订单权限全解析

毕业设计选题年年有人纠结,年年有人踩坑。如果你正在Java方向徘徊,看到“网上购物商城”这个题目,我想说的是:这个题非常适合作为毕设,但前提是你得把它做出层次感来,而不是交一个增删改查的“玩具”上去。…

2026/10/10 3:22:16 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 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/8 21:13:17 阅读更多 →
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/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练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/9 6:17:20 阅读更多 →