2014-10-16 20 views
7

मैं किसी तृतीय पक्ष एपीआई कि JSON प्रतिक्रियाओं रिटर्न के रूप में इस के साथ संवाद स्थापित कर रहा हूँ:सुरक्षित JSON से बचने वाले JSON युक्त स्ट्रिंग को सुरक्षित रूप से कैसे परिवर्तित करें?

"{\"SomeResponse\":{\"FIrstAttribute\":8,\"SecondAttribute\":\"On\",\"ThirdAttribute\":{\"Id\":2,\"FirstName\":\"Okkie\",\"Name\":\"Bokkie\",\"Street\":\"\",\"StreetNumber\":null,\"PostCode\":\"\",\"City\":\"\",\"Country\":\"}}}" 

यह JSON की तरह है ... लेकिन एक स्ट्रिंग के रूप में। पहले और अंतिम डबल कोट्स और निश्चित रूप से सभी भागने की धड़कन पर ध्यान दें।

वर्तमान में, मैं इसे स्ट्रिंग द्वारा हल करता हूं। बैकस्लाश और पहले और अंत उद्धरण को बदलना। उसके बाद, मैं इसे पार्स करने में सक्षम हूं।

mystring.Replace("\\", ""); 

हालांकि, क्या गुणों में से एक वास्तव में मूल्य के रूप में बैकस्लैश है? उदाहरण के लिए:

\"SecondAttribute\":\"My Super Back Slash: \\ . That was it.\" 

उस स्थिति में, मैं गलती से बैकस्लैश को हटा दूंगा जो मूल्य में होना चाहिए।

क्या किसी के पास इस JSON स्ट्रिंग को सही तरीके से पार्स करने के बारे में एक उज्ज्वल विचार है?

+3

आप संस्करण है कि आप पोस्ट कैसे देख रहे हैं? क्या यह वास्तव में * उन सभी बैकस्लाशों को शामिल करता है, या आप इसे डीबगर में देख रहे हैं? यदि आप इसे 'कंसोल। राइटलाइन' के साथ कंसोल पर डंप करते हैं, तो यह कैसा दिखता है? –

+0

नहीं, वास्तव में वास्तव में ये सभी स्लेश शामिल हैं। पहले से ही जांच की है। यह दुर्भाग्य से डीबगर नहीं है। – Gonzalioz

+0

क्रोम का उपयोग कर ब्राउज़र में एपीआई अनुरोध करते समय भी मुझे यह मिलता है। – Gonzalioz

उत्तर

11

यह मूल रूप से JSON एन्कोडेड के रूप में एक JSON स्ट्रिंग है - टिप्पणियों के अनुसार आपकी स्ट्रिंग के अंत में बहुत कम डॉक्टरिंग के बाद। प्रभावी रूप से पहले, तो परिणाम पार्स करने unescape को ऐसा लगता है कि संभाल करने Json.NET में, JToken.Parse का उपयोग कर भी मुश्किल नहीं है:

using System; 
using System.IO; 
using Newtonsoft.Json.Linq; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     string text = File.ReadAllText("test.json"); 
     JToken token = JToken.Parse(text); 
     JObject json = JObject.Parse((string) token); 
     Console.WriteLine(json); 
    } 
} 

आउटपुट:

{ 
    "SomeResponse": { 
    "FIrstAttribute": 8, 
    "SecondAttribute": "On", 
    "ThirdAttribute": { 
     "Id": 2, 
     "FirstName": "Okkie", 
     "Name": "Bokkie", 
     "Street": "", 
     "StreetNumber": null, 
     "PostCode": "", 
     "City": "", 
     "Country": "" 
    } 
    } 
} 

कि यहां तक ​​कि डेटा बैकस्लैश युक्त के साथ ठीक किया जाना चाहिए, क्योंकि मैं बैकस्लाश को एक बार फिर से एन्कोड करने की अपेक्षा करता हूं - लेकिन यह दोहरी जांच के लायक होगा।

+0

'var text =" {\ "PersonName \": \ "Gol \\ ld \"} "' और यह सही ' JToken टोकन = JToken.Parse (टेक्स्ट); 'खराब JSON भागने अनुक्रम के साथ: \ l'। यह आपके लिए कैसे काम करता है? कृपया साझा करें। –

+3

@SriReddy: यह अमान्य है - बैकस्लैश के साथ एक स्ट्रिंग बनाने के लिए, आप ' जेएसओ में एक डबल बैकस्लैश की जरूरत है एन, जिसका अर्थ है आपकी स्ट्रिंग शाब्दिक में * चौथाई * बैकस्लैश, उदा। 'var text =" {\ "PersonName \": \ "Gol \\\\ ld \"} "; 'लेकिन यह केवल शाब्दिक में है, जेएसओएन में नहीं ... JSON में केवल एक डबल बैकस्लैश है। –

+0

@SriReddy: यह पूरी तरह से स्पष्ट नहीं है कि ओपी के कोड में दूसरा उदाहरण वास्तविक, मान्य JSON सी # स्रोत कोड के रूप में लिखा गया है - लेकिन ऐसा नहीं है। वह जेएसओएन पार्स नहीं करेगा, लेकिन यह बैकस्लैश युक्त पाठ के जेएसओएन एन्कोडिंग का स्रोत प्रतिनिधित्व नहीं है। कोई वैध JSON ठीक है। –

1

उह ... यह बिल्कुल JSON नहीं है। यह एक अजीब जेएसओएन जैसी नकल है, लेकिन एक बहुत बुरा है। मुझे लगता है कि आप सही काम कर रहे हैं।

myString.Replace(@"\""", @"""); // replace \" with "

यह आप सुरक्षित रूप से नेस्टेड "\" chararcters संरक्षित करने के लिए अनुमति देगा:

केवल एक चीज है कि मैं कर सकता बस एक भागने चार के बजाय पात्रों के जोड़े पर बदलने के आपरेशन करना है , ताकि फ़िल्टर किया JSON लगता है:

field_blah: "root\branch\sub-branch"

मैं दृढ़ता से "JSON" पाठ की विस्तृत समीक्षा के उपक्रम और यह सुनिश्चित करना है कि यह केवल है की सलाह युग्मित अनुक्रम जिसके बारे में आपको चिंता करने की ज़रूरत है। यदि आपके पास अन्य जोड़ी हैं, तो उन्हें ऊपर उल्लिखित तरीके से संभाल लें।

1

using Newtonsoft.Json; 

    String json="{\"SomeResponse\":{\"FIrstAttribute\":8,\"SecondAttribute\":\"On\",\"ThirdAttribute\":{\"Id\":2,\"FirstName\":\"Okkie\",\"Name\":\"Bokkie\",\"Street\":\"\",\"StreetNumber\":null,\"PostCode\":\"\",\"City\":\"\",\"Country\":\"}}}";  

    dynamic result = JsonConvert.DeserializeObject(json); 

संबंधित मुद्दे