我有一个 javascript 对象,其中包含许多整数属性以及日期值和整数数组。每当我在对象上调用 JSON.stringify(entityModel, null, 2) 并将结果传递给 HTTP 处理程序时,我都会得到如下结果:
{
"UserId": "12345",
"Name": "Stewart",
"PositionId": "2",
"NextBirthday": "10-11-2013",
"FavouriteColour": "Blue",
"Hobbies": "1,3" // this is an array of ints in the client object prior to stringificaiton
}
当我想要的是
{
"UserId": 12345,
"Name": "Stewart",
"PositionId": 2,
"NextBirthday": "10-11-2013",
"FavouriteColour": "Blue",
"Hobbies": [1,3]
}
我是 JSON 新手,但有人可以告诉我我哪里出错了吗?基本上在服务器端,我的反序列化器不会将 Hobbies 属性反序列化为整数数组,并且当它们被 JSON 视为字符串时,整数可能会出现问题。
## 编辑当页面加载时,我的客户对象是这样的:
function EntityModel(){
this.UserId = null;
this.Name = null;
this.PositionId = null;
this.NextBirthday = null;
this.FavouriteColour = null;
this.Hobbies = null;
}
然后我给它赋值,检查这个值是否是一个数字,并在适当的地方使用 parseInt 赋值一个整数值。对于爱好属性,我分配了一个整数数组,如下所示:
var checkedValues = new Array();
element.find("input[type=checkbox]:checked").each(function () {
checkedValues.push(parseInt($(this).val()));
});
return checkedValues;
所以我的对象最终应该看起来像这样
function EntityModel(){
this.UserId = 123;
this.Name = "Stewart";
this.PositionId = 2;
this.NextBirthday = '10-11-2013';
this.FavouriteColour = 'blue';
this.Hobbies = [1,2];
}
然后我将对象传递给处理程序,如下所示:
var json = JSON.stringify(entityModel, null, 2);
$.ajax({
url: handlerPath,
contentType: "application/json; charset=utf-8",
type: 'POST',
dataType: "json",
data: json,
success: OnComplete,
error: OnFail
});
最后在处理程序端,我检索 JSON 字符串
using (StreamReader inputStream = new StreamReader( HttpContext.Current.Request.InputStream ))
{
jsonString = inputStream.ReadToEnd();
}
它看起来像这样
"{\n \"UserId\": \"12345\",\n \"Name\": \"Stewart\",\n \"PositionId\": \"2\",\n \"NextBirthday\": \"2013-11-10\",\n \"FavouriteColour\": \"Blue\",\n \"Hobbies\": \"1,2,3\"\n}"
# 编辑 2
以下是我用来为我的客户对象赋值的函数。第一个函数返回一个整数数组(如果该值基于复选框列表选择)或一个 int(如果值是一个数字)或一个字符串
function getElemValue(element, elementType, targetType) {
switch (elementType) {
case "System.Web.UI.WebControls.CheckBoxList":
var checkedValues = new Array();
element.find("input[type=checkbox]:checked").each(function () {
checkedValues.push(parseInt($(this).val()));
});
return checkedValues;
default:
return TryParseInt(element.val());
}
}
function TryParseInt(str) {
var retValue = str;
if (str != null) {
if (str.length > 0) {
if (!isNaN(str)) {
retValue = parseInt(str);
}
}
}
return retValue;
}