javascript对象的服务器端类型是什么,使用JSON序列化客户端,通过ajax调用传递



这不是最清晰的问题标题,很抱歉,但我会尽我所能分解我的问题。

我有一些客户端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){
}

最新更新