[英]How to iterate over object sent via AJAX JSON
我有以下JavaScript对象:
var parameters = { "parameters" :
[
{
"key": "feedbackSource",
"value": "foo"
}, {
"key": "status",
"value": "foo"
}, {
"key": "feedbackType",
"value": "foo"
}
]
};
console.log(JSON.stringify(parameters))显示:
{"parameters":[{"key":"feedbackSource","value":"foo"},{"key":"status","value":"foo"},{"key":"feedbackType","value":"foo"}]}
AJAX:
$.ajax({
type: "POST",
url: "myPage.aspx/MyMethod",
data: JSON.stringify(parameters),
contentType: "application/json; charset=utf-8",
dataType: "json"
});
方法:
[WebMethod]
public static void MyMethod(object parameters)
{
}
我努力了:
foreach (var p in (IEnumerable) parameters)
{
foreach (var x in (IEnumerable) p)
{
var test = x;
}
}
但是第一次迭代的test
是一个Key Value对,其中Key = "key"
和Value = "feedbackSource"
。 在第二次迭代中, Key = "value"
和Value = "foo"
这似乎不是迭代对象的正确方法。 我期望Key = "feedbackSource"
和Value = "foo"
。
var parameters =
{
"parameters":
[
{"feedbackSource": "foo", "status": "foo", "feedbackType": "foo"}
]
};
创建下课
public class mComputedProp
{
public string feedbackSource { get; set; }
public string status { get; set; }
public string feedbackType { get; set; }
}
public class mcomputedprops
{
[JsonProperty("parameters")]
public List<mComputedProp> mprops = new List<mComputedProp>();
}
修改你的ajax调用
$.ajax({
type: "POST",
url: '@Url.Action("getComputedProperty", "Home")',
contentType: "application/json; charset=utf-8",
async: false,
dataType: "json",
data: JSON.stringify({ listjson: JSON.stringify(parameters) })
});
[WebMethod]
public void getComputedProperty(string listjson)
{
mcomputedprops mod = JsonConvert.DeserializeObject<mcomputedprops>(listjson);
string asdf = mod.mprops[0].feedbackSource.ToString();
}
“如何在C#中迭代该对象以获取内容”
与@Devlin进行了很好的讨论之后-已得出以下结论:
至少可以说,从页面生成的JSON字符串有点令人困惑。
现有的数据结构
{ "parameters" : [ { "key": "feedbackSource", "value": "foo" }, { "key": "status", "value": "foo" }, { "key": "feedbackType", "value": "foo" } ] };
数据非常混乱并且有些混乱-使得遍历和迭代内部对象非常困难。
它似乎是关键的:(key / value)对/对( 等等,什么? )
我建议首先(从页面内部)为JSON构建适当的键/值对结构。
像这样:
{ "parameters" :
[
{
"feedbackSource" : "foo"
},
{
"status" : "foo"
},
{
"feedbackType" : "foo"
}
]
}
ModelBinder 巧妙地将 parameter
辅助为Dictionary<string, object>
,因为它将JSON识别为键/值对-其中的值又是键值对 。
显然,C#中的每个类型都源自object
,因此接受它只是将其装在object
。
因此,为什么其他转换为string
建议都没有成功。
ASP.NET具有ModelBinder,它能够检测传递给方法的对象的类型,从而使在方法中获取数据时更加容易。
将MyMethod
签名中的object parameter
强制转换为Dictionary<string, string>
(在可能的情况下,请安全地进行操作)
像这样:
var paramsDict = parameters as Dictionary<string, object>;
if (paramsDict != null)
{
// Iterate over the dictionary in here
}
就像我们知道object parameters
已经是Dictionary<string, object>
(由于使用ModelBinder进行了一些向导),我们可以在MyMethod
签名中使用这种类型。
像这样:
[WebMethod]
public static void MyMethod(Dictionary<string, object> parameters)
{
// Iterate in here
}
现在,您已经有了一个好用且易于使用的Dictionary<string, object>
,可以轻松地对其进行迭代并从那里获取值。
像这样:
foreach (var param in paramsDict) // or "... in parameters" if you're using suggestion 2
{
var key = param.Key;
var value = param.Value;
// Manipulate/persist the data
}
然后由您决定如何操作/持久化数据,但这应为您提供从JSON对象获取数据的起点。
摘要
Dictionary<string, object>
MyMethod
签名以接受parameter
Dictionary<string, object>
类型,或将parameter
对象转换为Dictionary
(两者都应工作相同) Dictionary
每个项目。 然后,您可以访问每个项目的Key
和Value
,然后根据需要操作数据 此外
鉴于您的JSON字符串正在传入string
和string
键/值对,我怀疑您可以安全地使用Dictionary<string, string>
由ModelBinder拾取,或者在进行强制转换等时。 可能需要对此进行确认,然而
希望这会有所帮助,并为您的项目带来好运! :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.