繁体   English   中英

如何遍历通过AJAX JSON发送的对象

[英]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)
{

}

问题:如何在C#中迭代该对象以获取内容?

我努力了:

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数据结构

至少可以说,从页面生成的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在做什么?

根据@Devlin的屏幕截图: 调试屏幕截图

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

显然,C#中的每个类型都源自object ,因此接受它只是将其装在object

因此,为什么其他转换为string建议都没有成功。

ASP.NET具有ModelBinder,它能够检测传递给方法的对象的类型,从而使在方法中获取数据时更加容易。


传入/使用正确的类型

建议1

MyMethod签名中的object parameter强制转换为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签名以接受parameter Dictionary<string, object>类型,或将parameter对象转换为Dictionary (两者都应工作相同)
  • 迭代Dictionary每个项目。 然后,您可以访问每个项目的KeyValue ,然后根据需要操作数据

此外
鉴于您的JSON字符串正在传入stringstring键/值对,我怀疑您可以安全地使用Dictionary<string, string>由ModelBinder拾取,或者在进行强制转换等时。 可能需要对此进行确认,然而

希望这会有所帮助,并为您的项目带来好运! :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM