『壹』 涓轰粈涔坖son搴忓垪鍖栧悗鏈灏惧嚭鐜伴棶鍙
json搴忓垪鍖栧悗鏈灏惧嚭鐜伴棶鍙风殑鍘熷洜鏈夛細
1銆侀潪娉曞瓧绗︽垨缂栫爜闂棰橈細JSON瑙勮寖瑕佹眰鎵鏈夌殑瀛楃︿覆鍊煎繀椤讳娇鐢ㄥ弻寮曞彿鎷璧锋潵锛岃屼笉鏄鍗曞紩鍙凤紝鍦↗SON瀛楃︿覆涓浣跨敤浜嗗崟寮曞彿锛屽垯搴忓垪鍖栬繃绋嬩腑浼氬嚭鐜扮紪鐮侀棶棰橈紝瀵艰嚧瀛楃︿覆搴忓垪鍖栧悗鏈灏惧嚭鐜伴棶鍙枫
2銆佺紪鐮佹牸寮忎笉鍖归厤锛欽SON搴忓垪鍖栬繃绋嬩腑锛屽皢Python瀵硅薄杞鍖栦负JSON瀛楃︿覆鏃讹紝闇瑕佺‘淇濆硅薄鐨勭紪鐮佹牸寮忎笌JSON瑙勮寖鎵鏀鎸佺殑缂栫爜鏍煎紡鍖归厤锛屽硅薄鐨勭紪鐮佹牸寮忎笉鏄疛SON瑙勮寖鎵鏀鎸佺殑锛岄偅涔堝湪搴忓垪鍖栬繃绋嬩腑浼氬嚭鐜扮紪鐮侀棶棰橈紝瀵艰嚧瀛楃︿覆搴忓垪鍖栧悗鏈灏惧嚭鐜伴棶鍙枫傚簭鍒楀寲鏄鎸囧皢瀵硅薄杞鎹涓哄瓧鑺傛祦鐨勮繃绋嬶紝浠ヤ究鍦ㄧ綉缁滀笂浼犺緭鎴栧瓨鍌ㄥ埌纾佺洏绛変粙璐ㄤ腑锛屽湪搴忓垪鍖栬繃绋嬩腑锛屽硅薄鐨勭姸鎬佽缂栫爜涓哄瓧鑺傛祦锛屽彲浠ュ湪闇瑕佹椂杩涜屽弽搴忓垪鍖栨搷浣滐紝灏嗗瓧鑺傛祦閲嶆柊杞鎹涓哄硅薄銆
『贰』 Python: 在使用 JSON 时需要注意的编码问题!
在使用Python的requests库进行接口请求时,若直接通过json字段发送包含中文的请求数据,可能会遇到服务器无法识别的问题。原因在于requests库内部默认使用json.mps进行字符串转JSON操作时,会对非ASCII字符进行转义处理。这意味着在发送的数据中,中文字符被转换为转义字符,例如"中文"会被转为"\u4e2d\u6587",导致服务器无法正确解析。
理解Python中的字符编码对于解决这一问题至关重要。在Python3中,字符默认使用Unicode编码存储,一个常规字符通常由两个字节表示,而某些特殊或罕见字符可能需要四个字节。例如,在Python Shell中输入字符串'\u4e2d\u6587',输出结果为"中",这里\u4e2d和\u6587分别代表"中"和"文"的Unicode码点的十六进制表示。
获取字符的Unicode码点可以利用Python的标准库函数ord和chr。ord函数输出字符的Unicode码点,而chr函数则将码点转换回字符。
在使用json.mps函数时,`ensure_ascii`参数的设置至关重要。当`ensure_ascii`为`True`时,如果字符串中包含非ASCII字符,json.mps会将其转义为Unicode码表示,例如将"中文"转为"\\u4e2d\\u6587"。而将`ensure_ascii`设为`False`,则不进行转义,直接使用原始字符。这就是导致中文被转义无法识别的原因。
若服务器接收到的数据是被转义过的,可以通过将接收到的字符串先使用utf-8编码,再使用unicode_escape进行解码,以识别转义字符。具体实现方法是先将接收到的字符串编码为utf-8,然后使用`unicode_escape`解码,这样可以复原转义字符。
深入理解json.mps的转义机制,可以发现其通过调用`JSONEncoder.encode`方法处理字符。在`encode`方法中,根据`ensure_ascii`的值选择调用不同的函数进行转义处理。`encode_basestring_ascii`函数是用于处理基本字符串的,其内部调用的`py_encode_basestring_ascii`函数实现转义逻辑。此函数通过正则表达式对特定字符进行转义处理,然后在前后添加双引号。转义规则定义在`ESCAPE_ASCII`中,其主要关注的是转义字符和空格字符,对于中文字符也会进行转义处理。
总结,使用requests库发送包含中文的JSON数据时,应确保正确编码,避免因非ASCII字符转义导致的数据无法识别问题。在实际应用中,将`ensure_ascii`参数设置为`False`是一个有效解决方案,以确保中文字符在传输过程中保持原始形式。