javascript对象的服务器端类型是什么,使用JSON序列化客户端,通过ajax调用传递
本文关键字:通过 客户端 ajax 调用 序列化 使用 对象 服务器端 类型 javascript 是什么 | 更新日期: 2023-09-27 18:23:43
这不是最清晰的问题标题,很抱歉,但我会尽我所能分解我的问题。
我有一些客户端javascript,正在尝试进行ajax服务器端调用,传递一些数据。我正在使用JSON序列化这些数据。
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
data: stringifyData(dataToStringify)
dataType: "json",
});
stringifyData = function (dataToStringify){
var requestParameters = {};
requestParameters.requestData = dataToStringify;
return JSON.stringify(requestParameters)
}
这是我正在使用的代码,运行良好。
//client side JS
var dataToStringify = 'John'
//Becomes- '{"requestData":"John Smith"}'
//server side c#
[WebInvoke(Method = "POST")]
public string ajaxCall(string requestData){
//stuff
}
如果我串行化一个简单的字符串,它就会去串行化为一个字符串。
//client side JS
var dataToStringify = {}
dataToStringify.FirstName = 'John'
dataToStringify.SurName = 'Smith'
//Becomes- '{"requestData":{"Firstname":"John","Surname":"Smith"}}'
//server side c#
public class Person {
string Firstname {get;set;}
string Surname {get;set;}
}
[WebInvoke(Method = "POST")]
public string ajaxCall(Person requestData){
//stuff
}
如果我串行化一个javascript对象,那么它就会去串行化为一个合适的服务器端对象(定义了所有键)。
//client side JS
var dataToStringify = {}
dataToStringify.Key1 = 'Val1'
dataToStringify.Key2 = 'Val2'
...
dataToStringify.Keyn = 'Valn'
//Becomes- '{"requestData":{"Key1":"Val1","Key2":"Val2"...,,"Keyn":"Valn"}}'
//server side c#
[WebInvoke(Method = "POST")]
public string ajaxCall(??? requestData){
//stuff
}
我的问题是,我试图传递一个键不是全部已知的对象——一个简单的键/值对列表。但我不能让它正确地去序列化。使用"Dictionary"作为服务器端类型无效,泛型"Object"也无效。
在我的最后一个例子中,reqestData对象应该是什么类型?我努力实现的目标可能实现吗?
非常感谢。
@Etch的答案是正确的,但如果我没记错的话,KeyValuePair
对序列化不是很友好
您可以定义一个自己的简单(键、值)结构,并传递它:
struct JSONableKeyValuePair
{
public string Key;
public string /*or whatever type*/ Value;
}
然后你的json应该是一个数组,看起来像:[ {'Key' : 'key 1', 'Value': 'value 1'}, {'Key' : 'key 2', 'Value': 'value 2'}]
如果您将调用服务的json更改为
"requestData":[{"Key1":"Val1"},{"Key2":"Val2"}]
这应该适用于KeyValuePair<string,string>
。我没有尝试过使用KeyValuePair
,但我以这种方式使用了List<>
。
编辑
在查看了我的服务后,我注意到我不使用List<>
,而是使用数组。所以在你的情况下:
public string ajaxCall(Person[] requestData){
}