问题描述 :在使用FJsonObjectConverter::UStructToJsonObjectString将带有UPROPERTY的结构体USTRUCT转换为 JSON 字符串时生成的 JSON Key 在 UE 编辑器PIE下和打包发布Packaged后出现大小写不一致的现象。示例结构体中定义了UPROPERTY() FString id;编辑器运行结果{id: ...}(正常小写)打包发布后结果{iD: ...}(出现异常大写 D)根本原因 :此问题由 Unreal Engine 底层的FName机制以及运行时加载顺序差异导致并非 JSON 转换器本身的 Bug。FName的大小写不敏感与全局表UE 的反射系统UHT使用FName来存储结构体中的变量名Property Name。FName为了提高检索效率是大小写不敏感的并共用一个全局字符串表Name Pool。当引擎生命周期中第一次创建某个特定拼写的FName时例如 iD该字符串连同其当前的大小写格式就会被永久缓存在全局表中。后续所有同名忽略大小写的FName都会直接复用第一次注册时的大小写格式。环境加载顺序差异编辑器模式和打包后的独立运行环境下引擎模块Modules和资源Assets的加载顺序完全不同。打包后在我们的结构体加载前引擎内部的其他模块或第三方插件率先向内存中注册了名为iD的FName。转换器取值逻辑FJsonObjectConverter在执行序列化时会调用Property-GetName()获取变量名作为 JSON 的 Key。因为全局表已被污染为iD导致导出的 JSON Key 发生改变。诸如id、name、type等通用极简词汇极易触发此命名冲突。解决方案:方案一放弃反射自动转换手动组装 JSON最推荐安全稳定针对对接外部服务器后端通常对大小写严格敏感的接口避免使用FJsonObjectConverter改用底层的FJsonObject手动序列化100% 掌控 Key 名CTSharedPtrFJsonObject JsonObj MakeShareable(new FJsonObject); JsonObj-SetStringField(TEXT(id), ResData.id); // 强行硬编码小写 id FString JsonString; TSharedRefTJsonWriter Writer TJsonWriterFactory::Create(JsonString); FJsonSerializer::Serialize(JsonObj.ToSharedRef(), Writer);方案二修改变量命名规避冲突如果前后端接口允许在定义UPROPERTY时避免使用id这样过于泛用的词汇增加特定前缀降低碰撞概率例如CUPROPERTY() FString ResId; // 替代 id总结 :UE 的FName机制决定了依赖反射获取的名称无法保证绝对的大小写安全。凡是涉及到跨系统通信网络协议、保存本地 JSON/XML 配置文件等且要求严格大小写的场景永远不要轻信自动反射序列化工具对于通用词汇id, name, data 等的处理手动构建或加特异性前缀才是最稳妥的做法。