簡體   English   中英

如何將dict轉換為unicode JSON字符串?

[英]How can I convert a dict to a unicode JSON string?

使用標准庫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"}'

但是當然,沒有output_encoding這樣的選項,所以這里是實際的輸出:

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

總而言之 - 我想將Python dict轉換為UTF-8 JSON字符串而不會有任何轉義。 我怎樣才能做到這一點?


我會接受以下解決方案:

  • 黑客(預處理和后處理輸入到dumps以實現預期效果)
  • 子類化JSONEncoder (我不知道它是如何工作的,文檔不是很有用)
  • PyPi上提供的第三方庫

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')

要求

  • 確保您的python文件以UTF-8編碼。 否則你的非ascii字符將成為問號, ? Notepad ++具有出色的編碼選項。

  • 確保包含相應的字體。 如果要顯示日文字符,則需要安裝日文字體。

  • 確保IDE支持顯示unicode字符。 否則,您可能會拋出UnicodeEncodeError錯誤。

例:

UnicodeEncodeError: 'charmap' codec can't encode characters in position 22-23: character maps to <undefined>

PyScripter適合我。 它包含在http://portablepython.com/wiki/PortablePython3.2.1.1的 “Portable Python”中

  • 確保您使用的是Python 3+,因為此版本提供了更好的unicode支持。

問題

json.dumps()轉義unicode字符。

閱讀底部的更新。 要么...

用解析的unicode字符替換每個轉義字符。

我創建了一個名為getStringWithDecodedUnicode的簡單lambda函數。

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

這里是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 ) )

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 )

產量

json.dumps({'Japan': '日本'}) = {"Japan": "\u65e5\u672c"}
Decoded Unicode: {"Japan": "日本"}

更新

或者......只需通過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"}'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM