【问题标题】:What is the server side type of a javascript object, serialised client side using JSON, that is passed via an ajax call?javascript 对象的服务器端类型是什么,使用 JSON 序列化客户端,通过 ajax 调用传递?
【发布时间】:2012-02-07 15:23:18
【问题描述】:

这不是最清晰的问题标题,对此感到抱歉,但我会尽我所能解决我的问题。

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

我的问题是我试图传递一个对象,其中键并不都是已知的——一个简单的键/值对列表。但我无法让它正确反序列化。使用“字典”作为服务器端类型不起作用,通用“对象”也不起作用。

在我的最后一个例子中,reqestData 对象应该是什么类型?我正在努力实现的目标可能吗?

非常感谢。

【问题讨论】:

  • JavaScriptSerializer 将您的数据完全反序列化为 Dictionary<string,string>。但我不知道如何强制您的服务器端代码使用它而不是DataContractJsonSerializer

标签: c# javascript ajax json serialization


【解决方案1】:

@Etch 的答案是正确的,但如果我没记错的话,KeyValuePair 对序列化不太友好。
您可以定义自己的简单 (key, value) 结构,然后将其传递:

struct JSONableKeyValuePair
{
   public string Key;
   public string /*or whatever type*/ Value;
}

然后你的 json 应该是一个数组,看起来像:
[ {'Key' : 'key 1', 'Value': 'value 1'}, {'Key' : 'key 2', 'Value': 'value 2'}]

【讨论】:

  • 太棒了。需要对我的键/值 javascript 对象进行一些调整以使其格式正确,现在我的服务器端代码接受了我定义的结构的数组。
【解决方案2】:

如果您将用于调用服务的 json 更改为

"requestData":[{"Key1":"Val1"},{"Key2":"Val2"}]

这应该适用于KeyValuePair<string,string>。我没有尝试使用KeyValuePair,但我以这种方式使用List<>

编辑

查看我的服务后,我注意到我没有使用List<>,但是我使用了一个数组。所以在你的情况下:

public string ajaxCall(Person[] requestData){
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-10
    • 2010-10-07
    • 1970-01-01
    • 2014-08-14
    相关资源
    最近更新 更多