我正在关注一个奇怪的问题。以下是详细说明
我的JSON字符串对象
public class ChartSearchCriteria
{
public ChartSearchCriteria()
{
}
public DateTime StartDate
{
get;
set;
}
public DateTime EndDate
{
get;
set;
}
public Int32 ClassType
{
get;
set;
}
public Int32 InstructorID
{
get;
set;
}
}
我正在将此对象转换为JSON字符串并分配给一个隐藏字段
ChartSearchCriteria objChartSearchCriteria = new ChartSearchCriteria()
{
StartDate = startDate,
EndDate = endDate,
ClassType = Convert.ToInt32(ddlClassType.SelectedValue)
};
string jsonSearchCriteria = new JavaScriptSerializer().Serialize(objChartSearchCriteria);
// Here in jsonSearchCriteria i am getting following string
// "{\"StartDate\":\"\\/Date(1436466600000)\\/\",\"EndDate\":\"\\/Date(1439145000000)\\/\",\"ClassType\":0,\"InstructorID\":0}"
hdnSearchData.Value = jsonSearchCriteria;
我想将此json字符串传递给另一个带有查询字符串的页面。我使用了以下javascript来获取网址
alert(document.getElementById("hdnSearchData").value);
// Here i am getting following JSON string from hidden field
// {"StartDate":"\/Date(1436466600000)\/","EndDate":"\/Date(1439145000000)\/","ClassType":0,"InstructorID":0}
var searchData = JSON.parse(document.getElementById("hdnSearchData").value);
var redirectUrl = _spPageContextInfo.webAbsoluteUrl + "/_layouts/15/DetailedChart.aspx?searchdata=" + encodeURIComponen(JSON.stringify(searchData));
现在我使用以下代码将json字符串反序列化为对象到另一个页面,我已将该json字符串作为查询字符串传递
string jsonString = Convert.ToString(Page.Request.QueryString["searchdata"]);
jsonString = HttpUtility.UrlDecode(jsonString);
// Here I am getting following json string
// {"StartDate":"\/Date(1436466600000)\/","EndDate":"\/Date(1439145000000)\/","ClassType":0,"InstructorID":0}
JavaScriptSerializer oJS = new JavaScriptSerializer();
ChartSearchCriteria oRootObject = new ChartSearchCriteria();
oRootObject = oJS.Deserialize<ChartSearchCriteria>(jsonString);
所以我在这里得到例外:
“日期(234234000)”无法转换为将json字符串反序列化为对象时的日期时间
我得到的唯一一件事是,在将json字符串分配给隐藏字段时,它正在从json中丢失转义字符。
从服务器端创建的JSON字符串:
{\ “开始日期\”:\ “\ /日期(1436466600000)\ / \”,\ “结束日期\”:\ “\ /日期(14391.45亿)\ / \”,\ “类类别\”:0, \ “InstructorID \”:0}“
使用javascript从客户端获取JSON字符串:
{ “开始日期”: “/日期(1436466600000)/”, “结束日期”: “/日期(14391.45亿)/”, “类类别”:0 “InstructorID”:0}
因此,您可以在上面看到将json字符串分配给隐藏字段时显示的不同字符串,它正在删除转义字符,这就是为什么我无法将其转换回对象到另一个页面的原因。
我确信100%它是与转义字符相关的问题,因为我已经使用以下字符串检查了反序列化方法并且它工作正常
{\ “开始日期\”:\ “\ /日期(1436466600000)\ / \”,\ “结束日期\”:\ “\ /日期(14391.45亿)\ / \”,\ “类类别\”:0, \ “InstructorID \”:0}“
那么我该如何解决这个问题呢?我的最终目标是将json字符串传递给另一个页面并反序列化为同一个对象。
任何帮助都将受到高度赞赏,让我知道有人想要更多信息。
答案 0 :(得分:0)
我已使用以下代码解决了问题。
string jsonString = Convert.ToString(Page.Request.QueryString["searchdata"]);
jsonString = HttpUtility.UrlDecode(jsonString);
// Here I am getting following json string
// {"StartDate":"\/Date(1436466600000)\/","EndDate":"\/Date(1439145000000)\/","ClassType":0,"InstructorID":0}
// By using following line I have corrected json string and now it is being deserialized to object.
jsonString = jsonString.Replace("/", "\\/");
JavaScriptSerializer oJS = new JavaScriptSerializer();
ChartSearchCriteria oRootObject = new ChartSearchCriteria();
oRootObject = oJS.Deserialize<ChartSearchCriteria>(jsonString);