171

Obj-C から JSON でエンコードされた文字列を受け取り、以下のコードのようなダミー文字列を (今のところ) デコードしています。私の出力は、各項目の前に文字「u」が付いています。

[{u'i': u'imap.gmail.com', u'p': u'aaaa'}, {u'i': u'333imap.com', u'p': u'bbbb'}...

JSON はこのユニコード文字をどのように追加していますか? それを取り除く最良の方法は何ですか?

mail_accounts = []
da = {}
try:
    s = '[{"i":"imap.gmail.com","p":"aaaa"},{"i":"imap.aol.com","p":"bbbb"},{"i":"333imap.com","p":"ccccc"},{"i":"444ap.gmail.com","p":"ddddd"},{"i":"555imap.gmail.com","p":"eee"}]'
    jdata = json.loads(s)
    for d in jdata:
        for key, value in d.iteritems():
            if key not in da:
                da[key] = value
            else:
                da = {}
                da[key] = value
        mail_accounts.append(da)
except Exception, err:
    sys.stderr.write('Exception Error: %s' % str(err))

print mail_accounts
4

9 に答える 9

179

u- プレフィックスは、Unicode 文字列があることを意味します。文字列を実際に使用すると、データには表示されません。印刷された出力に惑わされないでください。

たとえば、これを試してください:

print mail_accounts[0]["i"]

u は表示されません。

于 2012-12-18T19:44:46.197 に答える
161

すべてがクールです、男。「u」は良いことです。これは、文字列が python 2.x の Unicode 型であることを示します。

http://docs.python.org/2/howto/unicode.html#the-unicode-type

于 2012-12-18T19:45:07.757 に答える
59

以下のd3プリントはあなたが探しているものです(これはダンプとロードの組み合わせです):)

持つ:

import json

d = """{"Aa": 1, "BB": "blabla", "cc": "False"}"""

d1 = json.loads(d)              # Produces a dictionary out of the given string
d2 = json.dumps(d)              # Produces a string out of a given dict or string
d3 = json.dumps(json.loads(d))  # 'dumps' gets the dict from 'loads' this time

print "d1:  " + str(d1)
print "d2:  " + d2
print "d3:  " + d3

版画:

d1:  {u'Aa': 1, u'cc': u'False', u'BB': u'blabla'}
d2:  "{\"Aa\": 1, \"BB\": \"blabla\", \"cc\": \"False\"}"
d3:  {"Aa": 1, "cc": "False", "BB": "blabla"}
于 2015-12-27T10:56:42.800 に答える
10

ここでは Unicode が適切なタイプです。JSONDecoder ドキュメントでは、変換テーブルについて説明し、json 文字列オブジェクトが Unicode オブジェクトにデコードされると述べています。

https://docs.python.org/2/library/json.html#encoders-and-decoders

JSON                    Python
==================================
object                  dict
array                   list
string                  unicode
number (int)            int, long
number (real)           float
true                    True
false                   False
null                    None

"encoding は、このインスタンスによってデコードされた str オブジェクトを解釈するために使用されるエンコーディングを決定します (デフォルトでは UTF-8)。"

于 2012-12-18T19:46:20.023 に答える
8

プレフィックスは、これらのu文字列が 8 ビット文字列ではなく Unicode であることを意味します。プレフィックスを表示しない最善の方法uは、文字列がデフォルトで Unicode である Python 3 に切り替えることです。それがオプションでない場合、strコンストラクターは Unicode から 8 ビットに変換するため、単純に結果を再帰的にループして に変換unicodestrます。ただし、文字列を unicode のままにしておくのがおそらく最善です。

于 2012-12-18T19:45:31.423 に答える
4

loggingデバッグとトラブルシューティングの目的で、Python ライブラリを使用してログに JSON データをキャプチャしようとすると、この問題が発生し続けました。uテキストをコピーしてコードのどこかに貼り付けたい場合、文字を取得するのは本当に面倒です。

誰もが言うように、これは Unicode 表現であるためでありjson.loads()、最初に文字列からデータを読み込んでいたことが原因である可能性があります。

プレフィックスなしでログに JSON 表現が必要な場合は、ログアウトする前uに使用するのがコツですjson.dumps()。例えば:

import json
import logging

# Prepare the data
json_data = json.loads('{"key": "value"}')

# Log normally and get the Unicode indicator
logging.warning('data: {}'.format(json_data))
>>> WARNING:root:data: {u'key': u'value'}

# Dump to a string before logging and get clean output!
logging.warning('data: {}'.format(json.dumps(json_data)))
>>> WARNING:root:data: {'key': 'value'}
于 2018-08-15T12:18:12.347 に答える