अजगर: json.loads 'u' के साथ प्रीफ़िक्सिंग आइटम लौटाता है


161

मुझे एक JSON एनकोडेड स्ट्रिंग फॉर्म Obj-C प्राप्त होगा, और मैं नीचे दिए कोड की तरह एक डमी स्ट्रिंग (अभी के लिए) को डिकोड कर रहा हूं। मेरा आउटपुट प्रत्येक आइटम के उपसर्ग वर्ण 'यू' के साथ आता है:

[{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

7
अजगर को यहाँ एक समस्या है। सब कुछ सर्द नहीं है। जब मैं कोशिश करता हूं और जब मैं इन तार को किसी फाइल में लिखता हूं, तो मुझे उन स्ट्रिंग्स में त्रुटियां हो जाती हैं जो पाइथन बनाता है। उदाहरण के लिए, जब अजगर JSON से "53" लेता है तो वह इसे u'53 में बदल देता है और इसे एक फाइल में लिखने का प्रयास करता है जैसे कि हेक्स कैरेक्टर u '\ xe1' जो पायथन को पूरी तरह से अच्छा स्ट्रिंग लेने का कारण बनता है और उस पर Puke करता है: JSON: {"sa_BstDeAv": "53", "sa_BwVUpMx" ... PYTHON: {u'sa_BstDeAv ': u'53', u'sa_BwVUpxx '... ERROR ON WRITE: मान त्रुटि (' ascii ') कोडेक एनकोड नहीं कर सकता स्थिति 5 में वर्ण u '\ xe1': क्रमांक (128) में क्रमिक नहीं
डेविड यूर्री

@janehouse यहाँ सही उत्तर है jdi द्वारा उत्तर दिया गया है मुझे वास्तव में लगता है कि आपको इसे बदलना चाहिए।
डेकेल

जवाबों:


168

U- उपसर्ग का अर्थ है कि आपके पास एक यूनिकोड स्ट्रिंग है। जब आप वास्तव में स्ट्रिंग का उपयोग करते हैं, तो यह आपके डेटा में दिखाई नहीं देगा। मुद्रित आउटपुट द्वारा फेंका नहीं जाना चाहिए।

उदाहरण के लिए, इसे आज़माएँ:

print mail_accounts[0]["i"]

आप एक यू नहीं देखेंगे


5
आपका उत्तर मेरे लिए सबसे उपयोगी था, और मुझे लगता है कि इस प्रश्न के प्रश्नकर्ता ने वास्तव में इसकी सराहना की होगी: stackoverflow.com/questions/956867/…
jimh

1
आपको बहुत - बहुत धन्यवाद ! मैं इतने लंबे समय के लिए यू '' पत्र के लिए उलझन में था
केतन खंडागले

यदि आप इसे कॉपी और पेस्ट करते हैं तो सिवाय इसके कि uआपके डेटा में भारी मात्रा में एस है। सच कहूँ तो, uयह इंगित करने के लिए कि यह एक यूनिकोड स्ट्रिंग है प्रिंट करना पायथन के बारे में सबसे खराब गलतियों में से एक है। पूरी तरह से हास्यास्पद है। aअगर यह ASCII है तो हर स्ट्रिंग से पहले प्रिंट क्यों नहीं किया जाता है ? एक iअगर यह एक पूर्णांक है?
स्नोक्रैश

पायथन 2 में, यूनिकोड के तार बाइट के तारों की तुलना में एक अलग प्रकार के होते हैं, इसलिए डेटा के पुनरावृत्ति में यह इंगित करने के लिए उपसर्ग शामिल होता है। यह क्या सामग्री होने के बारे में नहीं है, यह प्रकार के बारे में है। यू उपसर्ग ठीक है अगर आप सामग्री को पायथन प्रोग्राम में वापस चिपका रहे हैं। यदि नहीं, तो शायद आप इसके बजाय json.dumps () का उपयोग करना चाहते हैं।
नेड बाचेल्ड

आपको json के शब्दकोश को खोजने के लिए स्ट्रिंग का उपयोग करना होगा। हालाँकि आप डॉट ऑपरेटर का उपयोग नहीं कर सकते हैं।
मैडॉक्स

151

सब कुछ शांत है, यार। 'यू' एक अच्छी बात है, यह इंगित करता है कि स्ट्रिंग अजगर 2.x में यूनिकोड का प्रकार है।

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


71
मैं इस एक के बहुत ठंडा स्वर पसंद है। +1 (सही) उत्तर के लिए जिसने मुझे मुस्कुरा दिया।
mgilson

19
बस, सर्द ... (◉Д┛) 彡 ((
फुल्वियो

31
मैं StackOverflow पर पढ़ा है कि सबसे अधिक आराम का जवाब था।
आन्रव

3
☮ ☮ ☮ शांति ☮ ☮ s
sr9yar

54

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"}

3
है ना? json.dumps(JSON- एन्कोडेड) स्ट्रिंग के लिए वापस ताना परिवर्तित करता है। ओपी ऐसा नहीं करना चाहता था। -1।
मार्क अमेरी

10
लेकिन अगर आप इसे json.loads के साथ प्रयोग करते हैं तो यह डिक्शनरी को बिना एनकोड किए गए वर्णों के साथ आउटपुट करता है। यह प्रश्न का उत्तर है (यह ऊपर d3 प्रिंट है) उत्तर को अच्छी तरह से पढ़ें!
बुध

8

uउपसर्ग का मतलब है कि उन लोगों के तार यूनिकोड के बजाय 8 बिट तार कर रहे हैं। uउपसर्ग नहीं दिखाने का सबसे अच्छा तरीका पायथन 3 पर स्विच करना है, जहां तार डिफ़ॉल्ट रूप से यूनिकोड हैं। यदि यह विकल्प नहीं है, तो strनिर्माणकर्ता यूनिकोड से 8-बिट में परिवर्तित हो जाएगा, इसलिए केवल परिणाम पर पुनरावृत्ति करें और परिवर्तित unicodeकरें str। हालाँकि, यह शायद यूनिकोड के रूप में तारों को छोड़ने के लिए सबसे अच्छा है।


8

यहां यूनिकोड एक उपयुक्त प्रकार है। JSONDecoder डॉक्स रूपांतरण तालिका का वर्णन करता है और बताता है कि json स्ट्रिंग ऑब्जेक्ट्स को यूनिकोड ऑब्जेक्ट में डिकोड किया गया है

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

"एन्कोडिंग इस उदाहरण द्वारा डिकोड किए गए किसी भी ऑब्जेक्ट को व्याख्या करने के लिए उपयोग किए गए एन्कोडिंग को निर्धारित करता है (डिफ़ॉल्ट रूप से UTF-8)।"


7

उन 'यू' वर्णों को एक वस्तु में जोड़ा जा रहा है जो दर्शाता है कि वस्तु "यूनिकोड" में एन्कोडेड है।

यदि आप अपनी वस्तु से उन 'यू' वर्णों को हटाना चाहते हैं तो आप ऐसा कर सकते हैं:

import json, ast
jdata = ast.literal_eval(json.dumps(jdata)) # Removing uni-code chars

आइए अजगर के खोल से चेकआउट करें

>>> import json, ast
>>> jdata = [{u'i': u'imap.gmail.com', u'p': u'aaaa'}, {u'i': u'333imap.com', u'p': u'bbbb'}]
>>> jdata = ast.literal_eval(json.dumps(jdata))
>>> jdata
[{'i': 'imap.gmail.com', 'p': 'aaaa'}, {'i': '333imap.com', 'p': 'bbbb'}]

मेरा सुझाव है कि हर नौसिखिया बस इस स्क्रिप्ट को आज़माएं और आप स्वयं को ~ u'JSON आउटपुट से कनवर्ट करने के लिए एक स्क्रिप्ट है। जाने के लिए तैयार!
जॉर्डन गी

4

loggingडीबगिंग और समस्या निवारण उद्देश्यों के लिए, जब मैं पायथन लाइब्रेरी के साथ लॉग में JSON डेटा कैप्चर करने की कोशिश कर रहा था, तो मैं इस समस्या में भाग रहा था । हो रही uचरित्र एक असली उपद्रव जब आप पाठ की प्रतिलिपि बनाना चाहते हैं और इसे अपने कोड में पेस्ट कहीं है।

जैसा कि हर कोई आपको बताएगा, यह इसलिए है क्योंकि यह एक यूनिकोड प्रतिनिधित्व है, और यह इस तथ्य से आ सकता है कि आपने 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'}

1
यह वास्तव में सबसे अच्छा उत्तर होना चाहिए, कई संदर्भों में 'यू बिल्कुल नहीं "बस बाहर निकाल दिया"। इस के लिए बहुत बहुत धन्यवाद!
जेसिका पेनेल

1

इसे इस्तेमाल करे:

mail_accounts [0] .encode ( "ascii")


बिना किसी स्पष्टीकरण के एक उत्तर लगभग बेकार है। कृपया कुछ जानकारी जोड़ने की कोशिश करें जैसे कि यह क्यों मदद करेगा।
अभिलाष चंद्रन

व्यक्तिगत रूप से, मुझे बहुत अधिक अनावश्यक जानकारी विचलित करने वाले लंबे जवाब मिलते हैं। उपरोक्त उत्तर पहले से ही समझाते हैं कि मूल्य यूनिकोड है और इसे एससीआई में बदलने की आवश्यकता है इसलिए मैं यह सब नहीं दोहरा रहा हूं। बस मूल्य प्राप्त करने का एक सरल तरीका दिखा रहा है। अगर किसी को इस उत्तर का उपयोग करने में कोई समस्या है तो बस पूछें और आगे बताकर मुझे खुशी है! धन्यवाद
2nd पर दूसरी दृष्टि लैब

यह वास्तव में एकमात्र उत्तर है जो स्पष्ट रूप से दिखाता है कि प्रत्येक स्ट्रिंग को '' सामान्य '' (जो कि हास्यास्पद रूप से अक्षम होना चाहिए) json.loads, json.dumps चक्र के बिना without सामान्य ’पर फिर से कोड करना है।
एड रान्डेल

0

बस यू 'को एक एकल उद्धरण के साथ बदलें ...

print (str.replace(mail_accounts,"u'","'"))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.