包含中文的json对象转成字符串的方法

本文介绍了一种改进方法,用于将包含中文的JSON对象转换为字符串,解决了使用str()或json.dumps()时出现的错误,通过正则表达式提取并转换u开头的字符为汉字。

开发测试时,经常需要把包含中文的json对象转成json字符串后使用,如果使用str(json_obj)或者json.dumps(json_obj)转换,则生成如:{'a': {'b': u'\u4e2d\u6587'}},但我们要的结果是:{'a': {'b': '中文'}}。

前期曾有一个嵌套遍历对象的方法将中文取出来,然后拼到字符串中,方法有点笨拙。见http://hiying.net/post-32.html 

 

本次改进,通过先转成字符串::{'a': {'b': u'\u4e2d\u6587'}}, 然后用正则表达式取出\u开头的字符串,然后逐一转成汉字,最后replace

def json_to_str(obj):
"""将Json对象转换为字符串,解决用str()或json.dumps()中文出现错误的问题"""
import re
ret = ""
#替换掉中文前的u
string = str(obj).replace("u'","'").replace('u"', '"')
#正则
p = re.compile(r'\\u[0-9A-Fa-f]{4}')
#取得所有匹配到的字符串,如\u4e2d
cn_chars =p.findall(string)
for c in cn_chars:
string = string.replace(c, u_converter(c[2:]))
return string

def u_converter(c):
"""单个汉字的转换"""
if len(c):
try:
ncode = int(c, 16)
except:
pass
try:
uchar= unichr(ncode)
except:
pass
return uchar

转载自:包含中文的json对象转成字符串的方法(二)



转载于:https://www.cnblogs.com/wufawei/archive/2011/12/25/2300787.html

<think> 嗯,用户现在询问的是Qt中将JSON对象转换为字符串方法。根据引用,特别是引用[3]提供了具体的代码示例。需要梳理出清晰的步骤,同时强调中文处理和错误检查。 用户提到同事封装的方法返回QString,这表明实际项目中可能需要处理接口数据转换。用户可能遇到中文字符乱码问题,或者需要确保转换的稳定性。深层需求应该是希望代码健壮且能处理中文等特殊字符。 引用[3]中的示例分为两部分:构建JSON对象转为字符串,以及字符串转回JSON对象。用户当前只需要前半部分。关键点包括使用QJsonObject插入键值对,特别是处理中文时用QString::fromLocal8Bit避免乱码。然后通过QJsonDocument::setObject设置对象,再调用toJson方法生成QByteArray,最后转为QString。 需要注意的细节:toJson的参数QJsonDocument::Compact可以省略,默认就是紧凑格式。错误处理方面,虽然转换过程一般不会出错,但用户可能需要验证生成的字符串是否有效,这点可以补充说明。 另外,用户可能关心转换后的字符串是否符合标准JSON格式,是否需要处理嵌套结构。引用示例是简单对象,但方法同样适用于复杂对象。最后提醒检查QJsonDocument创建的有效性,确保转换成功。 </think> 在Qt中将JSON对象转换为字符串方法如下,基于引用资料整理出清晰步骤: ### 核心步骤(使用QJsonDocument) ```cpp #include <QJsonObject> #include <QJsonDocument> // 1. 创建JSON对象并填充数据 QJsonObject jsonObj; jsonObj.insert("key1", "value1"); jsonObj.insert("key2", 42); jsonObj.insert("msg", QString::fromLocal8Bit("中文示例")); // 处理中文 // 2. 将对象添加到JSON文档 QJsonDocument jsonDoc; jsonDoc.setObject(jsonObj); // 关键转换步骤 // 3. 转换为JSON字符串 QByteArray jsonData = jsonDoc.toJson(); // 默认格式化 // 或使用紧凑模式:jsonDoc.toJson(QJsonDocument::Compact); QString jsonString = QString(jsonData); ``` ### 关键说明 1. **中文处理** 使用 `QString::fromLocal8Bit()` 转换中文字符,避免乱码问题[^3]。 2. **格式化控制** - `toJson()`:默认生成带缩进的可读格式 - `toJson(QJsonDocument::Compact)`:生成无空格紧凑格式 3. **错误检查建议** 可在转换后验证结果: ```cpp if (!jsonString.isEmpty() && jsonString != "null") { qDebug() << "转换成功:" << jsonString; } ``` ### 完整示例场景 ```cpp // 创建JSON对象 QJsonObject userData; userData.insert("name", "张三"); userData.insert("age", 28); userData.insert("isVIP", true); // 转换并输出 QJsonDocument doc(userData); QString result = QString(doc.toJson(QJsonDocument::Indented)); qDebug().noquote() << result; ``` 输出: ```json { "age": 28, "isVIP": true, "name": "张三" } ``` ### 注意事项 1. 当JSON对象为空时,`toJson()` 可能返回 `"null"` 字符串 2. 包含中文字符时,确保源文件编码为UTF-8 3. 复杂结构(嵌套对象/数组)同样适用此方法[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值