JSON未解析为自定义对象

时间:2017-01-09 13:22:51

标签: c# json web-services

请参阅下面的AJAX:

 <script type="text/javascript"  src="Javascript/json2.js"></script>
    <script type="text/javascript" src="Javascript/jquery-1.11.1.min.js"></script>
    <script type = "text/javascript">
        function GetData() {
            $.ajax({
                type: "POST",
                url: "JSONExample.aspx/GetPerson",
            contentType: "application/json; charset=utf-8",
            dataType: "text",
            success: OnSuccess(),
            //async: false,
            failure: function (response) {
                alert('there was an error counting possibles')
            }
        });

        function OnSuccess() {
            return function (response) {
                alert(response);
                window.location.href("JSONExample.aspx?id=" + response);
            }
        }
        }
        GetData()
    </script>

以及下面的服务器端代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Services;
using Newtonsoft.Json;

namespace SerializeAndDeserializeJSON
{
    //[Serializable]
    public class Person
    {
        public String Name;
        public int Age;
    }

    public partial class JSONExample : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if ((Request.QueryString["id"]== null)==false)
            {
                var json = Request.QueryString["id"];
                var person = JsonConvert.DeserializeObject<Person>(json); //person is null
            }
        }

        [System.Web.Services.WebMethod]
        public static Person GetPerson()
        {
            Person p1 = new Person();
            p1.Name = "Ian";
            p1.Age=35;
            return p1;
        }
    }
}

在页面加载中,在页面加载后,Person对象的值如下:

名称:null 年龄:0

这个名字应该是伊恩,而年龄应该是35岁。我做错了什么?

1 个答案:

答案 0 :(得分:2)

  

我做错了什么?

尝试将dataType设置为json而不是text

dataType: 'json'

然后将javascript对象作为JSON字符串发送到id参数:

window.location.href("JSONExample.aspx?id=" + encodeURIComponent(JSON.stringify(response.d)));

请注意,我们在这里使用response.d,因为ASP.NET WebMethods使用此特殊属性序列化响应。

此外,您可能希望使用公共属性而不是模型的字段:

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

某些框架在字段上窒息。