2010-11-28 10 views
5

मैं सीख रहा हूं कि JSON फ़ाइल को डीकोड करने के लिए सरलजोन का उपयोग कैसे करें। लेकिन मुझे "अवैध \ escape" त्रुटि का सामना करना पड़ा। यहाँ कोडsimplejson.loads() अमान्य escape प्राप्त करें: 'x'

import simplejson as json 

def main(): 
    json.loads(r'{"test":"\x27"}') 

if __name__ == '__main__': 
    main() 

यहाँ है और त्रुटि संदेश

Traceback (most recent call last): 
    File "hello_world.py", line 7, in <module> 
    main() 
    File "hello_world.py", line 4, in main 
    json.loads(r'{"test":"\x27"}') 
    File "C:\Users\zhangkai\python\simplejson\__init__.py", line 307, in loads 
    return _default_decoder.decode(s) 
    File "C:\Users\zhangkai\python\simplejson\decoder.py", line 335, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "C:\Users\zhangkai\python\simplejson\decoder.py", line 351, in raw_decode 

    obj, end = self.scan_once(s, idx) 
    File "C:\Users\zhangkai\python\simplejson\scanner.py", line 36, in _scan_once 
    return parse_object((string, idx + 1), encoding, strict, _scan_once, object_ 
hook) 
    File "C:\Users\zhangkai\python\simplejson\decoder.py", line 185, in JSONObject 

    value, end = scan_once(s, end) 
    File "C:\Users\zhangkai\python\simplejson\scanner.py", line 34, in _scan_once 
    return parse_string(string, idx + 1, encoding, strict) 
    File "C:\Users\zhangkai\python\simplejson\decoder.py", line 114, in py_scanstr 
ing 
    raise ValueError(errmsg(msg, s, end)) 
ValueError: Invalid \escape: 'x': line 1 column 10 (char 10) 

मुझे लगता है कि JSON पार्सर भागने पहचान करने के लिए आते है। तो मैं जानना चाहता हूं कि क्या गलत है, और मुझे क्या करना चाहिए।

+2

@pyfunc धन्यवाद, मैं मेरे सवाल का अच्छी तरह से अगली बार फ़ॉर्मेट करने के लिए कोशिश करेंगे। :) – kkpattern

उत्तर

8

जेएसओएन में कोई हेक्स भाग नहीं है (\xNN) कुछ भाषाओं (जावास्क्रिप्ट सहित) और नोटेशन, details here की तरह है। इसमें एक यूनिकोड एस्केप है, \uNNNN जहां NNNN चार हेक्स अंक हैं, लेकिन \x हेक्स से बचने के लिए नहीं है।

+0

धन्यवाद। तो यदि JSON फ़ाइल में \ x नोटेशन है, तो मुझे इसे पहले स्वयं परिवर्तित करना चाहिए? – kkpattern

+6

@ user308587: अगर फ़ाइल में \ x' नोटेशन है, तो यह JSON प्रारूप में नहीं है। अगर आप अमान्य JSON को वैसे भी स्वीकार करना चाहते हैं, तो हाँ, आपको इसे स्वयं प्री-प्रोसेस करना होगा। मान लीजिए कि आप जावास्क्रिप्ट के तरीके से \ \ x' का इलाज करना चाहते हैं, '\ xNN' से '\ u00NN' में कनवर्ट करें (उदा।,' \ X27' '\ u0027' बन जाता है)। एफडब्ल्यूआईडब्लू, जावास्क्रिप्ट द्वारा '\ x' और '\ u' कैसे प्रबंधित किए जाते हैं - ** नहीं ** JSON - [ECMAScript spec] की धारा 7.8.4 (http: //www.ecma-international) द्वारा कवर किया गया है। org/प्रकाशन/मानकों/ECMA-262.htm)। लेकिन मेरा पठन यह है कि यह वास्तव में 'x' को' u' में बदलने और प्रमुख शून्य जोड़ने के मामले में है। बेस्ट, –

+0

@ टी.जे.क्रॉडर क्या आप कृपया एक्स को बदलकर और प्रमुख शून्य जोड़ना चाहते हैं? मैं एक ऐसे चरित्र के साथ कैसे करूं जो एक बड़ी स्ट्रिंग का हिस्सा है? – Volatil3

2

यह एक पार्सर से व्यवहार की उम्मीद है क्योंकि JSON अमान्य है; एक स्ट्रिंग के भीतर एक स्लेश केवल ", \, /, b, f, n, r, t या u (जो तब 4 हेक्स पात्रों द्वारा पालन किया जाना चाहिए) के द्वारा पीछा किया जा सकता है। एक x की अनुमति नहीं है। http://json.org/

0

पर कल्पना देखें कोशिश python-cjson

import cjson 
s = cjson.encode({'abc':123,'def':'xyz'}) 
print 'json: %s - %s' % (type(s), s) 
s = cjson.decode(s) 
print '%s - %s' % (type(s), s) 
संबंधित मुद्दे