我有一个像这样的Javascript对象:
var jsonDataActual = {
"source": [{
"name": "testCaption0",
"desc": "testDescrip0",
"values": [{
"from": "/Date(1338811241074)/",
"to": "/Date(1346760041074)/",
"label": "testLabel0",
"customClass": "GanttRed"
}]
}],
"navigate": "scroll",
"scale": "weeks",
"maxScale": "months",
"minScale": "days",
"itemsPerPage": 11,
"onItemClick": function (data) { },
"onAddClick": function (dt, rowId) { }
};
它对我来说很好。现在,由于我的要求和需要,我将整个对象(包括括号,即{}和分号;)作为服务器端的字符串(C#),并使用服务器端方法将其返回到ajax调用(web方法):
在服务器端方法我做这样的事情:
return new JavaScriptSerializer().Serialize(jsonData);
但现在整个返回的数据(在Success: function(msg){ var s=msg.d}
内)被视为字符串,因此它不起作用。
我试过这些:
1. var obj = eval('{' + msg.d +'}'); (removing beginning and ending braces in msg.d)
typeof(obj) is string. failed
2. eval('var obj ='+msg.d); (including beginning and ending braces in msg.d)
typeof(obj) is string. failed
3. var obj= jQuery.parseJson(msg.d);
typeof(obj) is string. failed
4. var obj = new Object();
//var obj = {};
obj=jQuery.parseJson(msg.d).
typeof(obj) is string. failed.
请帮忙。如何将服务器端返回的json转换为对象?
为什么不能为我工作?是因为我的json对象的结构??
为什么jsonDataActual
对我有用,但不是以字符串形式发送???
请帮助.....
答案 0 :(得分:2)
找到解决我特定问题的方法。
我正在使用我的json数据作为其值构造一个字符串变量。然后我将这个字符串返回给客户端函数(发出ajax请求的那个)。即。
服务器端方法
[WebMethod]
public static string GetJsonData()
{
string jsonData = String.Empty;
foreach(var dataItem in objEntireData.Items)
{
// jsonData +=
}
return new JavaScriptSerializer().Serialize(result);
}
但它没有用。因此,我没有构造一个字符串变量并将其序列化,而是编写了一个具有特定结构的类,并将其发送到return语句中(在序列化之后)。
即。见下面的课程
public class A
{
public A()
{
Values = new List<B>();
}
public string prop1 {get; set;}
public List<B> Values { get; set; }
}
public class B
{
public string prop2 { get; set; }
public string prop3 { get; set; }
}
我将使用此课程如下:
[WebMethod]
public static string GetJsonData()
{
List<A> objA = new List<A>();
A objAItem = new A();
foreach (var dbItem in objDataBaseValues)
{
objA.prop1 = "test";
B objBItem = new B();
b.prop2="value";
b.prop3="value";
objA.Values.Add(objBItem);
}
return new JavaScriptSerializer().Serialize(objA);
}
将我的整个数据包装成一个类结构,然后序列化这对我有用。我的客户端功能成功地将其识别为对象,即
$.ajax({
type: "POST",
url: "ProjectGanttChart.aspx/getData",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
var jsonData = jQuery.parseJSON(msg.d);
populateGantt(jsonData);
}
});
答案 1 :(得分:0)
试试这个
var json=(typeof msg.d) == 'string' ? eval('(' + msg.d + ')') : msg.d;
答案 2 :(得分:0)
我之前遇到过很多次。当WCF服务将返回的数据解密为JSON时,字符串数据将始终具有“”。您应始终返回WCF服务中的对象或对象列表 - 即使这些是在您的服务级别创建的自定义对象。
所以,你的服务应该是:
[OperationContract]
[WebGet(BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "/Test?testId={testId}", RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json)]
List<TestObjectJSON> Test(int testId);
然后,这将在服务端为您执行反序列化,而不使用Serializer。
答案 3 :(得分:0)
如何将服务器端返回的json转换为对象?
您可以使用JSON.parse
来执行此操作。
示例:
a = [1, 2];
x = JSON.stringify(a); // "[1,2]"
o = JSON.parse(x); // [1, 2];