Bug 记录:UE 结构体转 JSON 时 Key 字段大小写异常 (Editor 与打包后表现不一致)

问题描述 :

在使用 FJsonObjectConverter::UStructToJsonObjectString 将带有 UPROPERTY 的结构体(USTRUCT)转换为 JSON 字符串时,生成的 JSON Key 在 UE 编辑器(PIE)下和打包发布(Packaged)后出现大小写不一致的现象。

示例:

结构体中定义了 UPROPERTY() FString id;

  • 编辑器运行结果: {"id": "..."} (正常小写)

  • 打包发布后结果: {"iD": "..."} (出现异常大写 'D')

根本原因 :

此问题由 Unreal Engine 底层的 FName 机制以及运行时加载顺序差异导致,并非 JSON 转换器本身的 Bug。

  1. FName 的大小写不敏感与全局表:

    UE 的反射系统(UHT)使用 FName 来存储结构体中的变量名(Property Name)。FName 为了提高检索效率,是大小写不敏感的,并共用一个全局字符串表(Name Pool)。

    当引擎生命周期中第一次 创建某个特定拼写的 FName 时(例如 "iD"),该字符串连同其当前的大小写格式就会被永久缓存在全局表中。后续所有同名(忽略大小写)的 FName 都会直接复用第一次注册时的大小写格式。

  2. 环境加载顺序差异:

    编辑器模式和打包后的独立运行环境下,引擎模块(Modules)和资源(Assets)的加载顺序完全不同。

    打包后,在我们的结构体加载前,引擎内部的其他模块或第三方插件率先向内存中注册了名为 "iD" 的 FName。

  3. 转换器取值逻辑:

    FJsonObjectConverter 在执行序列化时,会调用 Property->GetName() 获取变量名作为 JSON 的 Key。因为全局表已被污染为 "iD",导致导出的 JSON Key 发生改变。诸如 id、name、type 等通用极简词汇极易触发此命名冲突。

解决方案:

方案一:放弃反射自动转换,手动组装 JSON(最推荐,安全稳定)

针对对接外部服务器(后端通常对大小写严格敏感)的接口,避免使用 FJsonObjectConverter,改用底层的 FJsonObject 手动序列化,100% 掌控 Key 名:

C++

复制代码
TSharedPtr<FJsonObject> JsonObj = MakeShareable(new FJsonObject);
JsonObj->SetStringField(TEXT("id"), ResData.id); // 强行硬编码小写 "id"

FString JsonString;
TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&JsonString);
FJsonSerializer::Serialize(JsonObj.ToSharedRef(), Writer);

方案二:修改变量命名规避冲突

如果前后端接口允许,在定义 UPROPERTY 时避免使用 id 这样过于泛用的词汇,增加特定前缀降低碰撞概率,例如:

C++

复制代码
UPROPERTY()
FString ResId; // 替代 id
总结 :
  • UE 的 FName 机制决定了依赖反射获取的名称无法保证绝对的大小写安全。

  • 凡是涉及到跨系统通信(网络协议、保存本地 JSON/XML 配置文件等)且要求严格大小写的场景,永远不要轻信自动反射序列化工具对于通用词汇(id, name, data 等)的处理,手动构建或加特异性前缀才是最稳妥的做法。

相关推荐
天外飞雨道沧桑11 小时前
我在浏览器里练了一个 792 参数的大模型,它学会了补全 JavaScript
开发语言·javascript·ai·ecmascript·ai编程
漫步的猪12 小时前
# 告别混乱与付费墙!Linkit:完全免费、本地优先的开源 AI 智能书签与收藏夹管理神器
人工智能·ai·开源·react·免费·书签·收藏夹
效率工作实验室12 小时前
搭建AI智能体应用,主流智能体开发平台应关注哪些核心能力
ai·agent·智能体开发平台·核心能力·ai智能体应用
sbjdhjd13 小时前
AI产业周度动态:从“更强模型”走向“可执行、可治理、可计价”的系统竞争 (2026年10月19日—10月25日)
人工智能·笔记·ai·开源·gemini·信息差·claude code
唯鹿14 小时前
AI生成UI代码实践(二)—— Figba 更新月记
ui·ai·figma·1024程序员节·蓝湖
沈健_算法小生14 小时前
PI模型与供应商: 一个工具接所有大模型
ai
不脱发的程序猿14 小时前
红利ETF量化策略
人工智能·python·ai·程序员·量化交易·etf·策略回测
ixiaoyang815 小时前
ioDraw v3.7.0 发布:AI 助手完成会话化改造,图表生成一次升级
ai·流程图·甘特图·思维导图·绘图软件·1024程序员节·mermaid
猫咪很可爱15 小时前
MySQL 5.7 备份恢复后函数与存储过程丢失:原因分析与正确备份姿势
数据库·mysql·bug·shell
林伽一16 小时前
训练断网、部署上门槛:AI 基础设施的两道新闸门|2026年10月25日
人工智能·科技·安全·ai·1024程序员节