![](/img/trans.png)
[英]Deserializing the JSON object passed from Ajax to ASP.NET MVC
[英]ASP.NET getting indexed values when deserializing JSON into a dynamic object
因此,我有一個從AJAX調用傳遞到控制器的JSON字符串。 我有一個要傳遞到動態對象中的索引值列表。
我用反序列化JSON
JsonConvert.DeserializeObject<dynamic>(s)
這是該動態對象的輸出:
"RolePermissions[0].RolePermissionId": "269",
"RolePermissions[0].HasAccess": "false",
"RolePermissions[1].RolePermissionId": "270",
"RolePermissions[1].HasAccess": "false",
"RolePermissions[2].RolePermissionId": "271",
"RolePermissions[2].HasAccess": "true",
"RolePermissions[3].RolePermissionId": "272",
"RolePermissions[3].HasAccess": "false"
當我嘗試訪問對象的一個屬性時
ssObj.RolePermissions[0].RolePermissionId
我得到一個RuntimeBinderException。 我嘗試使用JObject.Parse,它工作得很好,但是由於某種原因,數組中的值變得混亂。
任何幫助將不勝感激。 謝謝!
當您嘗試執行RolePermissions[0].RolePermissionId
您嘗試訪問的嵌套集合包含一個對象,該對象的索引為0,該對象的屬性為RolePermissionId
。但是您的JSON不代表對象的層次結構,它代表帶有鍵的單個平面對象/值對,其鍵包含句點和方括號。 由於c#標識符不允許此類字符,因此您無法直接使用dynamic
訪問此類屬性值。
相反,您的選擇包括:
利用JsonConvert.DeserializeObject<dynamic>(s)
實際上返回一個JObject
並使用其字典索引器這一事實:
var ssObj = JsonConvert.DeserializeObject<dynamic>(s); var rolePermissionId = (string)ssObj["RolePermissions[0].RolePermissionId"];
如果您喜歡稍微類型化的解決方案,則可以反序列化為Dictionary<string, dynamic>
:
var ssDict = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(s); var rolePermissionId = (string)ssDict["RolePermissions[0].RolePermissionId"];
或者,對於更靜態類型的解決方案,顯式解析為JObject
並使用LINQ to JSON :
var jObj = JObject.Parse(s); var rolePermissionId = (string)jObj["RolePermissions[0].RolePermissionId"];
顯示各種選項的樣本小提琴 。
如果您控制通過AJAX發送的數據,請確保正確格式化了發送的數據。
為了能夠反序列化變量s
,如:
var ssObj = JsonConvert.DeserializeObject<dynamic>(s);
並以這種方式訪問生成的對象:
ssObj.RolePermissions[0].RolePermissionId
那么s
的JSON值(基於您的示例和所需的行為)將必須如下所示:
{
"RolePermissions": [
{
"RolePermissionId": "269",
"HasAccess": "false"
},
{
"RolePermissionId": "270",
"HasAccess": "false"
},
{
"RolePermissionId": "271",
"HasAccess": "true"
},
{
"RolePermissionId": "272",
"HasAccess": "false"
}
]
}
這種快速的單元測試表明,將JSON反序列化為動態對象時,可以獲取索引值
[TestClass]
public class UnitTest1 {
[TestMethod]
public void GetIndexedValuesWhenDeserializingJSONIntoDynamicObject() {
var s = @"
{
'RolePermissions': [
{
'RolePermissionId': '269',
'HasAccess': 'false'
},
{
'RolePermissionId': '270',
'HasAccess': 'false'
},
{
'RolePermissionId': '271',
'HasAccess': 'true'
},
{
'RolePermissionId': '272',
'HasAccess': 'false'
}
]
}
";
var ssObj = JsonConvert.DeserializeObject<dynamic>(s);
var result = ssObj.RolePermissions[0].RolePermissionId;
Assert.AreEqual("269", (string)result);
}
}
因此,您需要確保將格式正確的JSON發送到控制器以實現所需的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.