javascript - 如何迭代通过 AJAX JSON 发送的对象

标签 javascript c# 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)
{

}

问题:如何在 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 在做什么?

根据@Devlin 的屏幕截图:debug screenshot

ModelBinder巧妙协助parameter作为Dictionary<string, object> ,因为它将 JSON 识别为键/值对 - 其中值又是键值对

显然,C# 中的每种类型都源自 object ,所以接受这一点只是将其装在 object 中。 .

这就是为什么还有其他建议将其转换为 string没有成功。

ASP.NET 有一个 ModelBinder,它能够检测传递给方法的对象类型,以便更轻松地在方法中获取数据。

<小时/>

传入/使用正确的类型

建议 1

转换object parameterMyMethod签名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 中的每一项。然后您可以访问KeyValue每个项目的 s,然后按照您的意愿操作数据

此外
假设您的 JSON 字符串传入 string 的键/值对和string ,我怀疑您可以安全地使用Dictionary<string, string>由 ModelBinder 拾取,或者在类型转换等时。但是可能需要对此进行确认

希望这对您有所帮助,祝您的项目好运! :)

关于javascript - 如何迭代通过 AJAX JSON 发送的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38403404/

相关文章:

javascript - Google Map API 可查找我住处附近的附近餐厅

javascript - GraphQL 片段的片段

c# - Linq - 无法将类型 'IEnumerable<IEnumerable<.XElement>>' 隐式转换为 'IEnumerable<.XElement>'

php - 来自另一个 PDO 查询结果的 PDO 查询

java - 提取GIT存储库信息

javascript - 另一种在转换为 ISO 字符串后不切片返回日期/时间的方法?

javascript - Protractor 无法访问其类共享其他元素的特定元素

c# - Process.MainModule --> "Access is denied"

c# - 井字游戏递归算法

javascript - 如何减少页面加载时间?