如何将dict转换为unicode JSON字符串?

Hub*_*bro 7 python json

使用标准库json模块似乎无法实现这一点.使用json.dumps它时会自动转义所有非ASCII字符,然后将字符串编码为ASCII.我可以指定它不会转义非ASCII字符,但是当它尝试将输出转换为ASCII时它会崩溃.

问题是 - 我不想要ASCII!我只想将我的JSON字符串作为unicode(或UTF-8)字符串.有没有方便的方法呢?

这是一个展示我想要的例子:

d = {'navn': 'Åge', 'stilling': 'Lærling'}
json.dumps(d, output_encoding='utf8')
# => '{"stilling": "Lærling", "navn": "Åge"}'
Run Code Online (Sandbox Code Playgroud)

但是当然,没有output_encoding这样的选项,所以这里是实际的输出:

d = {'navn': 'Åge', 'stilling': 'Lærling'}
json.dumps(d)
# => '{"stilling": "L\\u00e6rling", "navn": "\\u00c5ge"}'
Run Code Online (Sandbox Code Playgroud)

总而言之 - 我想将Python dict转换为UTF-8 JSON字符串而不会有任何转义.我怎样才能做到这一点?


我会接受以下解决方案:

  • 黑客(预处理和后处理输入dumps以达到预期效果)
  • 子类化JSONEncoder(我不知道它是如何工作的,文档不是很有用)
  • PyPi上提供的第三方库

Lar*_*tle 6

要求

  • 确保您的python文件以UTF-8编码.否则你的非ascii字符将成为问号?.Notepad ++具有出色的编码选项.

  • 确保包含相应的字体.如果要显示日文字符,则需要安装日文字体.

  • 确保IDE支持显示unicode字符.否则,您可能会收到UnicodeEncodeError错误.

例:

UnicodeEncodeError: 'charmap' codec can't encode characters in position 22-23: character maps to <undefined>
Run Code Online (Sandbox Code Playgroud)

PyScripter适合我.它包含在http://portablepython.com/wiki/PortablePython3.2.1.1的 "Portable Python"中

  • 确保您使用的是Python 3+,因为此版本提供了更好的unicode支持.

问题

json.dumps()转义unicode字符.

阅读底部的更新.要么...

用解析的unicode字符替换每个转义字符.

我创建了一个简单的lambda函数getStringWithDecodedUnicode,就是这样做的.

import re   
getStringWithDecodedUnicode = lambda str : re.sub( '\\\\u([\da-f]{4})', (lambda x : chr( int( x.group(1), 16 ) )), str )
Run Code Online (Sandbox Code Playgroud)

getStringWithDecodedUnicode是一个常规功能.

def getStringWithDecodedUnicode( value ):
    findUnicodeRE = re.compile( '\\\\u([\da-f]{4})' )
    def getParsedUnicode(x):
        return chr( int( x.group(1), 16 ) )

    return  findUnicodeRE.sub(getParsedUnicode, str( value ) )
Run Code Online (Sandbox Code Playgroud)

testJSONWithUnicode.py(使用PyScripter作为IDE)

import re
import json
getStringWithDecodedUnicode = lambda str : re.sub( '\\\\u([\da-f]{4})', (lambda x : chr( int( x.group(1), 16 ) )), str )

data = {"Japan":"??"}
jsonString = json.dumps( data )
print( "json.dumps({0}) = {1}".format( data, jsonString ) )
jsonString = getStringWithDecodedUnicode( jsonString )
print( "Decoded Unicode: %s" % jsonString )
Run Code Online (Sandbox Code Playgroud)

产量

json.dumps({'Japan': '??'}) = {"Japan": "\u65e5\u672c"}
Decoded Unicode: {"Japan": "??"}
Run Code Online (Sandbox Code Playgroud)

更新

或者......只是ensure_ascii=False作为json.dumps的选项传递.

注意:您需要满足我在开始时概述的要求,否则这不会起作用.

import json
data = {'navn': 'Åge', 'stilling': 'Lærling'}
result = json.dumps(d, ensure_ascii=False)
print( result ) # prints '{"stilling": "Lærling", "navn": "Åge"}'
Run Code Online (Sandbox Code Playgroud)


Xia*_*iao 6

encode_ascii=False 是恕我直言的最佳解决方案.

如果您使用的是Python2.7,这里是示例python文件:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# example.py
from __future__ import unicode_literals
from json import dumps as json_dumps
d = {'navn': 'Åge', 'stilling': 'Lærling'}
print json_dumps(d, ensure_ascii=False).encode('utf-8')
Run Code Online (Sandbox Code Playgroud)