2014-05-08 9 views
0

J'ai la méthode suivante et j'ai besoin de désérialiser le flux de récupération.Comment désérialiser JSON Stream dans C#

public void RedirectHyperlink(System.IO.Stream jsonString) 
    { 
     string val= JsonSteamToString(jsonString); 
    } 

public string JsonSteamToString(Stream jsonStream) 
    { 
     StreamReader reader = new StreamReader(jsonStream); 
     return reader.ReadToEnd(); 
    } 

Ma classe est la suivante:

public class H2JsonStateObject 
    { 
     public string url { get; set; } 
     public string stateId { get; set; } 
    } 

J'appelle cette méthode utilisant l'appel Ajax comme suit:

var value ="89aafdec-0a9e-4d05-b04e-1ca4bf8cfeb9"; 
var link="RedirectPage.aspx"; 
var data = '{"url":"' + link + '","stateId":"' + value + '"}'; 
var jsonToSend = JSON.stringify(data); 

$.ajax({ 
    cache: false, 
    url: "StateRedirectService.svc/RefreshPagemethod", 
    type: "POST", 
    async: false, 
    data: jsonToSend, 
    success: function (data, textStatus, jqXHR) { 
     window.location.href = link;   
    }, 
    error: function (xhr, status, error) { 
     alert('error'); 
    } 
}); 

Lorsque la demande de réception à la méthode Web et après la conversion du la valeur obtient la chaîne suivante.

"\"{\\\"url\\\":\\\"RedirectPage.aspx\\\",\\\"stateId\\\":\\\"89aafdec-0a9e-4d05-b04e-1ca4bf8cfeb9\\\"}\"" 

Maintenant je dois désérialiser url & stateid. Comment puis je faire ça?

J'ai essayé les suivants. mais ne pouvait pas désérialiser.

En utilisant DataContractJsonSerializer

using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(val))) 
{ 
     DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(H2JsonStateObject)); 
     H2JsonStateObject p2 = (H2JsonStateObject)deserializer.ReadObject(ms); 
} 

Il émet une exception et dit: état Expecting 'élément' .. Rencontrés 'Texte' avec le nom '', '' namespace.

En utilisant JavaScriptSerializer

var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); 
    Object obj = serializer.DeserializeObject(val); 

Cela me donne mon objet en tant que valeur de chaîne comme suit:

"{\"url\":\"RedirectPage.aspx\",\"stateId\":\"89aafdec-0a9e-4d05-b04e-1ca4bf8cfeb9\"}" 

Ce que je fait de mal et comment puis-je obtenir RedirectPage.aspx et 89aafdec-0a9e- 4d05-b04e-1ca4bf8cfeb9 valeur?

+1

Pensez à utiliser une bibliothèque JSON comme [JSON.net] (http://www.nuget.org/packages/newtonsoft.json/). –

+0

Ensuite, voir http://stackoverflow.com/questions/3142495/deserialize-json-into-c-sharp-dynamic-object?rq=1. –

Répondre

1

Capable de résoudre ce problème de la manière suivante. mon problème est avec la valeur de chaîne Json.

public void RedirectHyperlink(System.IO.Stream jsonString) 
    { 
     string val = JsonSteamToString(jsonString);   
     string JsonVal = val.Replace("\"", "'"); 
     var json_serializer = new JavaScriptSerializer(); 
     H2JsonStateObject myobj = json_serializer.Deserialize<H2JsonStateObject>(JsonVal); 
     H2RequestRedirect.RedirectToTemp(myobj.url, myobj.stateId); 
    } 

Cette chaîne doit être au format suivant.

JsonVal = "{'url': 'RedirectPage.aspx','stateId': '89aafdec-0a9e-4d05-b04e-1ca4bf8cfeb9' }"; 

Quand je vous appelle cette méthode i envoyer objet JSON sans JSON.stringify(data);

var data = '{"url":"' + link + '","stateId":"' + value + '"}'; 
    $.ajax({ 
     cache: false, 
     url: "StateRedirectService.svc/RedirectHyperlink", 
     type: "POST", 
     async: false, 
     data: data, 
     success: function (data, textStatus, jqXHR) { 
      //alert('OK'); 
      window.location.href = link;  }, 
     error: function (xhr, status, error) { 
      alert('error'); 
     } 
    }); 

Ensuite, il fonctionne comme un charme ...

Questions connexes