2016-07-25 3 views
1

Мой веб-сервис предоставляет json строку, отформатированную в XML, используя объект для сериализатора XMl. мой réponse, как:Невозможно разобрать строку ответа JSON на XML

public static string ObjectToXmlString(this Object obj) 
    { 
     string xmlStr = string.Empty; 
     XmlSerializer xs = new XmlSerializer(obj.GetType()); 
     XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
     ns.Add("", ""); 
     using (MemoryStream memoryStream = new MemoryStream()) 
     { 
      XmlWriterSettings settings = new XmlWriterSettings() 
      { 
       Encoding = Encoding.UTF8, 
       Indent = false, 
       OmitXmlDeclaration = true, 
       NewLineChars = string.Empty, 
       NewLineHandling = NewLineHandling.None 
      }; 
      using (XmlWriter writer = XmlWriter.Create(memoryStream, settings)) 
      { 
       xs.Serialize(writer, obj,ns); 
      } 
      return Encoding.UTF8.GetString(memoryStream.ToArray()).Replace("\"", string.Empty); 
     } 
    } 

Service Response:

"<ArrayOfOwnerShipDetails><OwnerShipDetails><OwnerShipId>80932</OwnerShipId><FileNumber>rp1144</FileNumber><Salutation>Mr</Salutation><OwnerFirstName>Jai Kumar Datwni ji</OwnerFirstName><OwnerMiddleName /><OwnerLastName /><ResidentialAddress>1159 Sec 18 C,c Hd</ResidentialAddress><EmailID /><MobileNumber /><VoterID /><AadharCardNo /><RelationCode>S</RelationCode><RelationDescription>Son of</RelationDescription><FatherOrHusbandName>Lachman Dass S</FatherOrHusbandName><PropertyShareInPercentage>50.00</PropertyShareInPercentage><AdditionalRemarks /></OwnerShipDetails></ArrayOfOwnerShipDetails>" 

Но когда я пытаюсь разобрать этот ответ JSON в другое приложение, где я звоню мою службу.

using (var client = new HttpClient()) 
       { 
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml")); 
        var response = client.GetAsync("http://localhost:50429/api/Haris/GetOwnersByFileNo?fileNo=RP1144").Result; 

        if (response.IsSuccessStatusCode) 
        { 
         // by calling .Result you are performing a synchronous call 
         var responseContent = response.Content; 

         // by calling .Result you are synchronously reading the result 
         string responseString = responseContent.ReadAsStringAsync().Result.Trim(); 


         // Create the XmlDocument. 
         XmlDocument doc = new XmlDocument(); 
         **doc.LoadXml(responseString); ---> Error Comes here** 


        } 
       } 

дает ошибку данных на корневом уровне является недействительным. Строка 1, позиция 1

Но если я копирую тот же ответ в блокнот, а затем вставляю его в переменную во время выполнения, он отлично работает. Что-то не так с двойными кавычками, входящими в строку json.

Пожалуйста, помогите мне здесь.

ответ

0

Используйте вместо этого метод Load(), это решит проблему. See more

Иначе

doc.LoadXml(responsestring.Substring(responsestring.IndexOf(Environment.NewLine))); 

Live Demo

+0

Я пробовал это, но оба дают ошибку: .Load() дает ---> Незаконные символы в пути. и responsestring.Substring (responsestring.IndexOf (Environment.NewLine) дает ----> {«StartIndex не может быть меньше нуля. \ r \ nParameter name: startIndex"} – Gerry

+0

использовать @ перед вашим xml во время загрузки. – Developer

+0

before xml string что я перехожу к .Load()? – Gerry

0

Наконец получил решение путем преобразования строки в пар и снова в строку:

string sb = responseString; 
         sb = responseString.Replace("\"", string.Empty).Trim().ToString().Trim(); 
         var a = GenerateStreamFromString(sb); 
         StreamReader reader = new StreamReader(a); 
         string text = reader.ReadToEnd(); 
         XmlDocument doc = new XmlDocument(); 
         doc.LoadXml(responseString); 

После этого я нашел это решение, которое отлично вписывается : POST: How do I prevent ReadAsStringAsync returning a doubly escaped string?