反序列化JSON以使用不同的属性名称键入

时间:2013-09-11 10:28:27

标签: asp.net jquery serialization json.net pagemethods

我有一个我正在序列化的类,但我正在使用[JsonProperty("Name")]属性注释更改输出字符串的属性名称。如下所示:

[JsonProperty("Name")]
public string PersonName{ get; set; }

现在,当我想要获取数据时,值无法映射到属性,因此它们被设置为null。
这就是我获取数据的方式:

[WebMethod]
    public static void GetData(List<Person> persons)
    {
    //each persons Name property comes as null
    }

这是我从客户端发送数据的方式:

$.ajax({
    type: "POST",
    url: "TestPage.aspx/GetData",
    data: "{'persons':" + '[{ "Name": "Me"}]' + "}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function () {
        alert("Data Submitted");
    }
});

现在我无法阻止.NET序列化我从客户端传递的JSON字符串,所以我必须让我的Page Method接受List<Person>的参数类型,否则我会得到错误,这也阻止了我使用JsonConvert.DeserializeObject<List<Person>>(person);来解决映射问题。
所以,有人请花点时间阅读帖子并给我一些想法。

1 个答案:

答案 0 :(得分:1)

您的网络方法正在接受人员列表,但这不是您从客户端传递的内容。您正在传递包含人员列表的对象。如果你想让它工作,你应该只传递列表本身,而不是将它包装在一个对象中。

$.ajax({
    type: "POST",
    url: "TestPage.aspx/GetData",
    data: '[{ "Name": "Me"}]',
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function () {
        alert("Data Submitted");
    }
});

另一种替代方法是,如果无法更改客户端,则更改服务器端以期望包装器对象。

创建一个类来保存列表...

class PersonListWrapper
{
    public List<Person> persons { get; set; }
}

...并更改您的网络方法以接受该课程。

[WebMethod]
public static void GetData(PersonListWrapper wrapper)
{
    foreach (Person p in wrapper.persons)
    {
        ...
    }
}