स्रोत से नीचे दी गई प्रतिक्रिया JSON देखें। स्रोत अपनी ओर से परिवर्तन करने के लिए लचीला नहीं है। चुनौती "परिणाम" के भीतर कुंजी मूल्य जोड़ी को डीकोड करना है।

{"result":"{\"key1\" : \"value with \"n,a.\".\" , \"key2\":\"value with \"n.a.\".\" }"}

परिणाम के भीतर नेस्टेड JSON:

{"key1" : "value with "n,a."." , "key2":"value with "n.a."."}

मैं डिकोडिंग के लिए पायथन का उपयोग कर रहा हूं।

json_string = '{\"result\":\"{\\"key1\\" : \\"value with \\"n,a.\\".\\" , \\"key2\\":\\"value with \\"n.a.\\".\\"}\"}'

#The following string with no double quotes within value part works as expected
#json_string = '{\"result\":\"{\\"key1\\" : \\"value with n,a.\\" , \\"key2\\":\\"value with n.a. .\\"}\"}'

data1 = json.loads(json_string)

data1['result']
# '{"key1" : "value with "n,a."." , "key2":"value with "n.a."."}'

data_dict_string = data1['result']
json_stringp = "[{0}]".format(data_dict_string)
data_list = json.loads(json_stringp)

निम्न त्रुटि में अपेक्षित परिणाम के रूप में दोहरे उद्धरण चिह्नों की उपस्थिति,

JSONDecodeError: Expecting ',' delimiter: line 1 column 25 (char 24)

कैसे JSON के मूल्य भाग के भीतर दोहरे उद्धरण चिह्नों को निकालने के लिए?

2
Naresh S 20 मई 2019, 14:54

1 उत्तर

संपादित करें: एक वास्तविक समाधान हो सकता है, जिसका विवरण नीचे दिया गया है।

उनका JSON निश्चित रूप से पूरी तरह से टूटा हुआ है, और सामान्य परिदृश्य में इसे ठीक करने के लिए आप पर नहीं होना चाहिए।

इस भ्रष्टाचार को उलटने का कोई सुरक्षित तरीका नहीं है क्योंकि, जैसा कि आप देख सकते हैं, जब एस्केप वर्ण छीन लिए जाते हैं तो जानकारी खो जाती है, इसलिए परिणाम अस्पष्ट होता है:

"{\"abc\": \"def\": \"ghi\"}" का मतलब या तो "{\"abc\": \"def\\": \\"ghi\"}" (मान def": "ghi) या "{\"abc\\": \\"def\": \"ghi\"}" हो सकता है (कुंजी abc": "def है)

कुछ अनुमान हैं जिन्हें आप लागू कर सकते हैं, बशर्ते कि डेटा संरचना काफी सरल हो और इसमें कोई अन्य समस्या न हो।

उदाहरण के लिए, यदि संरचना सपाट है और कुंजियाँ सभी अल्फ़ान्यूमेरिक हैं, तो आप संभावित कुंजियों (/(\{|\\", )\\"([a-z]+)\\": \\"/) की पहचान करने का प्रयास कर सकते हैं, और फिर उनके बीच/बाद की सामग्री को मानों के रूप में पार्स करने का प्रयास कर सकते हैं।

यदि नेस्टेड ऑब्जेक्ट हो सकते हैं (यदि किसी स्ट्रिंग में और बुरी तरह से एन्कोडेड JSON है तो अकेले रहने दें), यह और अधिक जटिल हो जाता है।

मूल रूप से, यह "दोष" से परे है - आप यहां एक अंडे को खोलने की कोशिश कर रहे हैं।


परिशिष्ट: कंप्यूटर विज्ञान के अनुसार, मुझे लगता है कि इस समस्या का वर्णन करना तकनीकी रूप से संभव है और संभावित रूप से इसे हल भी कर सकता है (यानी संभावित उम्मीदवार संरचनाओं की गणना करें जिन्हें किसी दिए गए से डीकोड किया जा सकता है स्ट्रिंग, जो उम्मीद से कम हैं, और जिसे आप सही खोजने के लिए और अधिक मान्य कर सकते हैं)। JSON को संदर्भ-मुक्त व्याकरण द्वारा वर्णित किया गया है और एस्केप वर्णों को हटाने से यह एक में बदल जाता है अस्पष्ट व्याकरण (अर्थात, एक व्याकरण जिसमें एक ही स्ट्रिंग उत्पन्न करने वाले एकाधिक सिंटैक्स ट्री हैं)। ऐसे पार्सिंग एल्गोरिदम हैं जो इसे (सबसे खराब) घन समय ओ (एन ^ 3) में संभालते हैं।

जहां तक ​​मैं बता सकता हूं, जीएनयू बाइसन इस पार्सर को लागू करता है, और यह एक पायथन पुस्तकालय के रूप में उपलब्ध है: http: //freenet.mcnabhosting.com/python/pybison/

इसलिए यदि आपके पास कोई अन्य विकल्प नहीं है और "टूटे हुए JSON" के व्याकरण को औपचारिक रूप दे सकते हैं, तो अंत में यह सबसे मजबूत (लेकिन काफी जटिल) दृष्टिकोण हो सकता है।

3
Christoph Burschka 20 मई 2019, 15:09