JSON官方的java扩展未对汉字未进行ascii转义的问题

本文转自:http://eit.name/blog/read.php?462
近日某同事在用java发布一个API时,使用Json进行数据编码,发现JSON官方的java扩展在处理汉字时未进行ascii转义,如下所示:
Java源码:

AppObject ao=new AppObject(20,"鱼漂");
try {
JSONObject jo=new JSONObject(ao);
System.out.println(jo.toString());
} catch (Exception e) {
System.out.println("json encode error.");
}

输出为:
{"name":"鱼漂","age":10}

其中的name仍然显示中文,未进行ascii转义,通常情况下是可以正常使用的,但在不同的系统互相调用时,可能需要编码转换,比如从GBK转到UTF8。

通过查看源代码发现,在JSONObject.java的1138-1139行,只将\u0080-\u00a0, \u2000-\u2100的字符转成\u的格式。汉字的unicode编码不在这两个范围之内,所以不会转换。

找到原因后,修改就比较简单,我们只需简单的将\u0080以上的所有字符,转成\u格式即可,将1138-1139行改为:
if (c < ' ' || c >= '\u0080') {

再次测试,输出结果为:
{"name":"\u9c7c\u6f02","age":10}
<think>好的,用户问的是Python如何将列表转换为JSON格式。首先,我需要确认用户的基础,可能他们已经有Python的基础知识,但不太了解json模块的使用。 首先,我应该回忆一下Python中处理JSON的标准库,肯定是json模块。这个模块提供了dumps和dump两个主要方法。用户的问题是将list转为JSON,所以重点在序列化过程。 接下来,我需要考虑用户可能的应用场景。比如,他们可能在处理数据存储、API交互,或者配置文件。不同的场景可能需要不同的参数设置,比如缩进或者排序键。但用户的问题比较基础,可能只需要基本的转换方法。 然后,我应该分步骤说明。首先导入json模块,然后用json.dumps()函数将列表转换为JSON字符串。举个例子,比如一个包含字典的列表,转换后会是JSON数组里的对象。这时候要提醒用户注意数据类型的对应,比如Python的列表对应JSON数组,字典对应对象,以及基本类型的转换。 可能还需要提到ensure_ascii参数,因为默认情况下非ASCII字符会被转义,用户如果想保留中文可能需要设置ensure_ascii=False。另外,缩进参数indent可以让生成的JSON更易读,比如indent=2。 另外,用户可能不知道dump和dumps的区别,是否需要简要说明?dumps生成字符串,而dump直接写入文件。如果用户的需求是保存到文件,可能需要提到这一点,但问题只提到转换,所以可能暂时不需要深入,但可以稍微提一下作为扩展。 还要注意错误处理,比如如果列表中有不支持的类型(如datetime对象),会抛出TypeError。这时候可能需要提醒用户处理这些特殊类型,比如先转换成字符串。 最后,总结步骤,给出示例代码,并解释关键点。确保用户能理解整个流程,并可以自己动手尝试。</think>在Python中,可以使用标准库`json`将list转换为JSON格式。以下是详细步骤说明: --- ### 步骤1:导入json模块 ```python import json ``` --- ### 步骤2:准备要转换的列表 示例列表(可包含嵌套结构): ```python my_list = [ {"name": "张三", "age": 25, "skills": ["Python", "Java"]}, {"name": "李四", "age": 30, "is_student": False} ] ``` --- ### 步骤3:使用json.dumps()转换 ```python json_str = json.dumps(my_list, ensure_ascii=False, indent=2) ``` - `ensure_ascii=False`:允许显示非ASCII字符(如中文) - `indent=2`:生成带缩进的格式化JSON(可读性更好) --- ### 步骤4:查看结果 ```python print(json_str) ``` 输出结果: ```json [ { "name": "张三", "age": 25, "skills": ["Python", "Java"] }, { "name": "李四", "age": 30, "is_student": false } ] ``` --- ### 扩展用法:直接写入文件 ```python with open('data.json', 'w', encoding='utf-8') as f: json.dump(my_list, f, ensure_ascii=False, indent=2) ``` --- ### 注意事项 1. 数据类型对应关系: - Python `list` → JSON `array` - Python `dict` → JSON `object` - Python `str` → JSON `string` - Python `int/float` → JSON `number` - Python `True/False` → JSON `true/false` - Python `None` → JSON `null` 2. 如果列表包含不支持的类型(如datetime对象),需要先转换为字符串或数值类型 3. 使用`sort_keys=True`参数可对字典键进行排序: ```python json.dumps(my_list, sort_keys=True) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值