如何在c#中反序列化Json Stream

时间:2014-05-08 04:45:21

标签: c# .net json c#-4.0 serialization

我有以下方法,我需要反序列化检索流。

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

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

我的课程如下:

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

我正在使用Ajax调用调用此方法,如下所示:

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');
    }
});

当请求收到web方法并转换后,它会得到以下字符串。

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

现在我需要反序列化url& STATEID。我怎么能这样做?

我试过以下。但无法反序列化。

使用 DataContractJsonSerializer

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

抛出异常并说: 期待状态'元素'..遇到'文字',名称'',名称空间''。

使用 JavaScriptSerializer

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

这使我的对象成为字符串值,如下所示:

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

我做错了什么,如何获得RedirectPage.aspx和89aafdec-0a9e-4d05-b04e-1ca4bf8cfeb9值?

1 个答案:

答案 0 :(得分:1)

能够通过以下方式解决此问题。我的问题是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);   
  }

这里的字符串需要采用以下格式。

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

当我调用此方法时,我发送的json对象没有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');
        }
    });

然后它就像一个魅力......