JSON: Python Objects与String之间转换【json.dumps把python任意数据类型转换成字符串,json.loads把字符串转换为unicode编码】

本文介绍了如何使用Python中的JSON模块实现数据类型的转换。通过dumps()函数将Python的数据结构编码为JSON格式的字符串,再利用loads()函数将JSON字符串解码回Python的数据结构。示例展示了列表中包含字典及元组类型数据的转换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.sina.com.cn/s/blog_4ddef8f80102v8af.html
JSON的dumps()函数可以将python的各种数据类型转换为字符串,loads()函数可以将相应的字符串转换回python变量,例如:
import json
data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]
data_string = json.dumps(data)
print 'ENCODED:', data_string
decoded = json.loads(data_string)
print 'DECODED:', decoded
print 'ORIGINAL:', type(data[0]['b'])
print 'DECODED :', type(decoded[0]['b'])

输出为:
ENCODED: [{"a": "A", "c": 3.0, "b": [2, 4]}]
DECODED: [{u'a': u'A', u'c': 3.0, u'b': [2, 4]}]
ORIGINAL:
DECODED :

**Note: 字符串被JSON转换为Unicode编码,tuple被JSON转换为list类型。
### 如何在 Redis 中存储包含转义字符的 JSON 字符串并确保数据完整性 当向 Redis 存储 JSON 数据时,如果其中包含了特殊字符(如双引号 `"` 或其他需要转义的字符),可能会因为编码或序列化方式的不同而导致数据被错误地转义。以下是几种解决此问题的技术方案。 #### 方法一:手动控制 JSON 序列化过程 通过直接构建 JSON 字符串而非依赖框架自动转换,可以有效避免多余的转义字符。例如,在 MySQL 的场景下可以通过 SQL 拼接来实现无多余转义的 JSON 插入[^5]: ```sql set @j='{"Monday":{"StartTime":"7:00","EndTime":"20:00"},"Wednesday":{"StartTime":"7:00","EndTime":"20:00"}}'; set @g=concat('{"WorkTime":', @j,'}'); UPDATE tb_userclockininfo SET ChangeType = 123, WorkTimeJson = @g WHERE loginName = 'ZR20080005'; ``` 这种方法适用于数据库层面的操作,但在 Redis 场景中也可以借鉴类似的思路——即绕过可能引入额外转义的中间层工具。 #### 方法二:调整序列化库的行为 某些情况下,默认使用的序列化/反序列化库会对输入数据做过度保护性的处理,从而增加不必要的转义。针对这种情况,可以选择自定义这些行为或者更换更灵活的库版本。比如 ServiceStack.Redis.Core v5.11.0 就存在这样的问题[^2];而升级至更高版本或其他替代品则有可能解决问题。 另外,在 Java 开发环境中利用 Spring Data Redis 提供的功能扩展点来自定义 Key 和 Value Serializer 是常见的做法之一[^3]: ```java @Configuration public class RedisConfig { @Bean public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory){ RedisTemplate<String, String> template = new RedisTemplate<>(); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); template.setConnectionFactory(factory); return template; } } ``` 上述代码片段展示了如何设置一个基于 Jackson 的通用 JSON 序列器作为 value serializer 来代替默认选项,这样能够更好地保留原始结构而不随意添加转义标记。 #### 方法三:后端逻辑修正 - 使用合适的解析函数 即使已经尽力减少前端传输过来的数据中的潜在干扰因素,仍然无法完全排除最终落地到 Redis 前仍有部分字段被意外修改的可能性。此时可以在读取阶段加入预处理步骤以恢复原貌。例如下面这段 Python 脚本演示了怎样从 ZSet 类型成员里提取经过适当清理后的列表项[^4]: ```python import json def process_zset(redis_util, key_name, page, size): set_num = (page - 1) * size // 20000 from_index = (page - 1) * size % 20000 raw_data = redis_util.get_zset_by_range(key_name, from_index, from_index + size - 1) parsed_objects = [] for item in raw_data: cleaned_item = json.loads(json.dumps(item)) # Double-parse trick to normalize escaped chars. obj_instance = YourClass(**cleaned_item) # Assuming there's a constructor accepting kwargs. parsed_objects.append(obj_instance) return parsed_objects ``` 这里的关键在于双重调用 `json` 函数完成一次标准化的过程,有助于消除因先前环节产生的冗余斜杠等问题。 --- ### 总结 为了防止存入 Redis 的字符串内的字符被不当转义,建议采取以下措施: - 手动编写精确匹配需求的 JSON 构造语句; - 更新所选用的服务栈组件直至其最新稳定版,并查阅官方文档确认最佳实践指南; - 自定义序列化机制以便于精准掌控整个流程链路; - 如果发现已有污染,则考虑运用特定算法修复目标记录集的内容偏差。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值