DSON से JSON अतिरिक्त दोहरे उद्धरण और उद्धरण से बचता है


86

मैं एक अजगर उपकरण के साथ ट्विटर डेटा को पुनः प्राप्त कर रहा हूं और इन्हें JSON प्रारूप में मेरी डिस्क पर डंप कर रहा हूं। मैंने दोहरे उद्धरण चिह्नों में संलग्न एक ट्वीट के लिए पूरे डेटा-स्ट्रिंग से बचने का एक अनपेक्षित भाग देखा। इसके अलावा, वास्तविक JSON प्रारूपण के सभी दोहरे उद्धरण एक बैकस्लैश के साथ बच गए हैं।

वे इस तरह दिखते हैं:

"{\" create_at \ ": \" शुक्र अगस्त 08 11:04:40 +0000 2014 \ ", \" आईडी \ ": 497699913925292032,

मैं इससे कैसे बचूं? यह होना चाहिए:

{"create_at": "शुक्र अगस्त 08 11:04:40 +0000 2014" .....

मेरा फ़ाइल-आउट कोड इस तरह दिखता है:

with io.open('data'+self.timestamp+'.txt', 'a', encoding='utf-8') as f:
            f.write(unicode(json.dumps(data, ensure_ascii=False)))
            f.write(unicode('\n'))

बाद में प्रोसेसिंग चरण में JSON फ़ाइल में पढ़ने पर अनजाने भागने से समस्याएँ होती हैं।

जवाबों:


140

आप अपने JSON स्ट्रिंग्स को डबल एन्कोडिंग कर रहे हैं। पहलेdata से ही एक JSON स्ट्रिंग है, और उसे फिर से एन्कोड करने की आवश्यकता नहीं है :

>>> import json
>>> not_encoded = {"created_at":"Fri Aug 08 11:04:40 +0000 2014"}
>>> encoded_data = json.dumps(not_encoded)
>>> print encoded_data
{"created_at": "Fri Aug 08 11:04:40 +0000 2014"}
>>> double_encode = json.dumps(encoded_data)
>>> print double_encode
"{\"created_at\": \"Fri Aug 08 11:04:40 +0000 2014\"}"

बस इन्हें सीधे अपनी फ़ाइल में लिखें:

with open('data{}.txt'.format(self.timestamp), 'a') as f:
    f.write(data + '\n')

f.write (डेटा + '\ n') - आपके उदाहरण से - डेटा = एन्कोडेड_डेटा से संबंधित है।
रिच एल्सविक

@RichElswick ओपी वैरिएबल का उपयोग करता है data, जिसमें पहले से एनकोड किया गया JSON डेटा होता है, इसलिए हां, मैंने चर नाम encoded_dataका उपयोग यह बताने के लिए किया था कि क्या चल रहा है।
मार्टिन पीटर्स

9

एक और स्थिति जहां यह अवांछित पलायन हो सकता है, अगर आप json.dump () के पूर्व-संसाधित आउटपुट पर json.dump () का उपयोग करने का प्रयास करते हैं। उदाहरण के लिए

import json, sys
json.dump({"foo": json.dumps([{"bar": 1}, {"baz": 2}])},sys.stdout)

में परिणाम होगा

{"foo": "[{\"bar\": 1}, {\"baz\": 2}]"}

इससे बचने के लिए, आपको json.dumps (), जैसे आउटपुट के बजाय शब्दकोशों को पास करना होगा

json.dump({"foo": [{"bar": 1}, {"baz": 2}]},sys.stdout)

जो वांछित परिणाम देता है

{"foo": [{"bar": 1}, {"baz": 2}]}

(आप json.dumps () के साथ आंतरिक सूची को पूर्व-संसाधित क्यों करेंगे, आप पूछते हैं? ठीक है, मेरे पास एक और फ़ंक्शन था जो उस आंतरिक सूची को अन्य सामान से बना रहा था, और मुझे लगा कि यह एक json ऑब्जेक्ट को वापस करने के लिए समझ में आएगा। वह कार्य ... गलत।)

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