[英]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)
{
}
我努力了:
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字符串有點令人困惑。
現有的數據結構
{ "parameters" : [ { "key": "feedbackSource", "value": "foo" }, { "key": "status", "value": "foo" }, { "key": "feedbackType", "value": "foo" } ] };
數據非常混亂並且有些混亂-使得遍歷和迭代內部對象非常困難。
它似乎是關鍵的:(key / value)對/對( 等等,什么? )
我建議首先(從頁面內部)為JSON構建適當的鍵/值對結構。
像這樣:
{ "parameters" :
[
{
"feedbackSource" : "foo"
},
{
"status" : "foo"
},
{
"feedbackType" : "foo"
}
]
}
ModelBinder 巧妙地將 parameter
輔助為Dictionary<string, object>
,因為它將JSON識別為鍵/值對-其中的值又是鍵值對 。
顯然,C#中的每個類型都源自object
,因此接受它只是將其裝在object
。
因此,為什么其他轉換為string
建議都沒有成功。
ASP.NET具有ModelBinder,它能夠檢測傳遞給方法的對象的類型,從而使在方法中獲取數據時更加容易。
將MyMethod
簽名中的object parameter
強制轉換為Dictionary<string, string>
(在可能的情況下,請安全地進行操作)
像這樣:
var paramsDict = parameters as Dictionary<string, object>;
if (paramsDict != null)
{
// Iterate over the dictionary in here
}
就像我們知道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對象獲取數據的起點。
摘要
Dictionary<string, object>
MyMethod
簽名以接受parameter
Dictionary<string, object>
類型,或將parameter
對象轉換為Dictionary
(兩者都應工作相同) Dictionary
每個項目。 然后,您可以訪問每個項目的Key
和Value
,然后根據需要操作數據 此外
鑒於您的JSON字符串正在傳入string
和string
鍵/值對,我懷疑您可以安全地使用Dictionary<string, string>
由ModelBinder拾取,或者在進行強制轉換等時。 可能需要對此進行確認,然而
希望這會有所幫助,並為您的項目帶來好運! :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.