我有以下 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)
{
}
问题:如何在 C# 中迭代该对象以获取内容?
我已经尝试过:
foreach (var p in (IEnumerable) parameters)
{
foreach (var x in (IEnumerable) p)
{
var test = x;
}
}
但是第一次迭代的 test
是一个键值对,其中 Key = "key"
和 Value = "feedbackSource"
。在第二次迭代中,Key = "value"
和 Value = "foo"
这似乎不是迭代对象的正确方法。我期望 Key = "feedbackSource"
和 Value = "foo"
。
最佳答案
"How do I iterate over that object in C# to get the contents"
在与@Devlin对此进行充分讨论后,得出以下结论:
当前 JSON 数据结构
(从页面)生成的 JSON 字符串至少可以说有点令人困惑。
现有的数据结构
{ "parameters" : [ { "key": "feedbackSource", "value": "foo" }, { "key": "status", "value": "foo" }, { "key": "feedbackType", "value": "foo" } ] };
非常令人困惑,并且在某种程度上混淆了数据 - 使得遍历和迭代内部对象变得非常困难。
它似乎是键:(键/值)对/对(等等,什么?)
我建议首先(从页面内)为 JSON 构建适当的键/值对结构。
像这样:
{ "parameters" :
[
{
"feedbackSource" : "foo"
},
{
"status" : "foo"
},
{
"feedbackType" : "foo"
}
]
}
<小时/>
ModelBinder 在做什么?
ModelBinder巧妙协助parameter
作为Dictionary<string, object>
,因为它将 JSON 识别为键/值对 - 其中值又是键值对。
显然,C# 中的每种类型都源自 object
,所以接受这一点只是将其装在 object
中。 .
这就是为什么还有其他建议将其转换为 string
没有成功。
ASP.NET 有一个 ModelBinder,它能够检测传递给方法的对象类型,以便更轻松地在方法中获取数据。
<小时/>传入/使用正确的类型
建议 1
转换object parameter
在 MyMethod
签名Dictionary<string, string>
(尽可能安全地进行)
像这样:
var paramsDict = parameters as Dictionary<string, object>;
if (paramsDict != null)
{
// Iterate over the dictionary in here
}
建议2
据我们所知,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 对象获取数据的起点。
摘要
- 将 JSON 结构更改为“正确的”键/值对
- 默认 ModelBinder 能够将 JSON 分配为 C#
Dictionary<string, object>
- 要么更改
MyMethod
签名接受Dictionary<string, object>
输入parameter
,或转换parameter
反对Dictionary
(两者的工作原理应该相同) - 迭代
Dictionary
中的每一项。然后您可以访问Key
和Value
每个项目的 s,然后按照您的意愿操作数据
此外
假设您的 JSON 字符串传入 string
的键/值对和string
,我怀疑您可以安全地使用Dictionary<string, string>
由 ModelBinder 拾取,或者在类型转换等时。但是可能需要对此进行确认
希望这对您有所帮助,祝您的项目好运! :)
关于javascript - 如何迭代通过 AJAX JSON 发送的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38403404/