我有以下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;
}
}
我试过了:
test
但第一次迭代的Key = "key"
是一个键值对,Value = "feedbackSource"
和Key = "value"
。在第二次迭代中,Value = "foo"
和Key = "feedbackSource"
这似乎不是迭代对象的正确方法。我希望Value = "foo"
和probs= ['2','3','5','6']
。
答案 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字符串(来自页面)至少可以说有点令人困惑。
的现有数据结构
{ "parameters" : [ { "key": "feedbackSource", "value": "foo" }, { "key": "status", "value": "foo" }, { "key": "feedbackType", "value": "foo" } ] };
数据有点令人困惑和模糊 - 使得遍历和迭代内部对象变得非常困难。
它似乎是关键:(键/值)对/对(等,什么?)
我建议首先(从页面内)为JSON构建一个正确的键/值对结构。
像这样:
{ "parameters" :
[
{
"feedbackSource" : "foo"
},
{
"status" : "foo"
},
{
"feedbackType" : "foo"
}
]
}
ModelBinder 巧妙将parameter
指定为Dictionary<string, object>
,因为它将JSON识别为键/值对 - 其中值又是键价值对。
显然,C#中的每个类型都来自object
,所以接受这个只是将它装在object
中。
这就是为什么投射到string
的其他建议没有成功。
ASP.NET有一个ModelBinder,它能够检测传递给方法的对象类型,以便在方法中获取数据时更容易。
将object parameter
签名中的MyMethod
投放到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
签名以接受Dictionary<string, object>
的{{1}}类型,或将parameter
对象转换为parameter
(两者都应该相同) Dictionary
中的每个项目。然后,您可以访问每个项目的Dictionary
和Key
,然后根据需要操作数据 <强>此外强>
鉴于您的JSON字符串传递了Value
和string
的键/值对,我怀疑您可以安全地使用string
来获取ModelBinder,或者在投射等时。 可能需要确认
希望这对您的项目有所帮助,祝您好运! :)