使用OpenStruct解析JSON时出现多余table&modifiable字段的问题排查
问题原因分析
1. table和modifiable字段的来源
你看到的table和modifiable是Ruby OpenStruct类的内部实例变量,并非API返回的内容:
@table:OpenStruct用来存储所有属性键值对的哈希容器@modifiable:控制是否允许动态给OpenStruct添加新属性的布尔标志
当应用中存在二次序列化操作(比如把解析后的OpenStruct对象再次转成JSON字符串、存入数据库,或是通过日志工具输出完整对象结构)时,JSON序列化库会遍历对象的所有实例变量并输出,这就把内部的table和modifiable也包含进去了。
而在Rails控制台直接执行解析代码时,控制台打印的是OpenStruct的友好展示格式(仅显示用户定义的属性),不会暴露内部实例变量,所以你看不到这些字段。
2. &符号被转义的原因
API响应里的&&解析为OpenStruct后,二次序列化时JSON库会按照标准JSON规则对特殊字符做转义,&被转义为\u0026是符合JSON规范的行为。而使用普通哈希(JSON.parse(response).deep_symbolize_keys!)时,后续序列化哈希的逻辑和OpenStruct不同,不会触发这个转义(或转义策略更宽松)。
3. 修复方案生效的原因
改用JSON.parse(response).deep_symbolize_keys!后,得到的是普通Ruby哈希对象:
- 哈希没有内部实例变量,序列化时只会输出业务相关的键值对
- 哈希的JSON序列化逻辑不会额外生成
table/modifiable字段,也不会对&做不必要的转义
内容的提问来源于stack exchange,提问作者Dev
相关产品推荐
相关产品推荐

