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

时间:2016-07-15 19:01:54

标签: javascript c# json

我有以下JavaScript对象:

{"parameters":[{"key":"feedbackSource","value":"foo"},{"key":"status","value":"foo"},{"key":"feedbackType","value":"foo"}]}

console.log(JSON.stringify(parameters))显示:

$.ajax({
    type: "POST",
    url: "myPage.aspx/MyMethod",
    data: JSON.stringify(parameters),
    contentType: "application/json; charset=utf-8",
    dataType: "json"
});

AJAX:

[WebMethod]
public static void MyMethod(object parameters)
{

}

方式:

foreach (var p in (IEnumerable) parameters)
{
    foreach (var x in (IEnumerable) p)
    {
        var test = x;
    }
}

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

我试过了:

test

但第一次迭代的Key = "key"是一个键值对,Value = "feedbackSource"Key = "value"。在第二次迭代中,Value = "foo"Key = "feedbackSource"

这似乎不是迭代对象的正确方法。我希望Value = "foo"probs= ['2','3','5','6']

2 个答案:

答案 0 :(得分:1)

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();
        }

答案 1 :(得分:1)

  

“如何在C#中迭代该对象以获取内容”

在与@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 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>的{​​{1}}类型,或将parameter对象转换为parameter(两者都应该相同)
  • 迭代Dictionary中的每个项目。然后,您可以访问每个项目的DictionaryKey,然后根据需要操作数据

<强>此外
鉴于您的JSON字符串传递了Valuestring的键/值对,我怀疑您可以安全地使用string来获取ModelBinder,或者在投射等时。 可能需要确认

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