簡體   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