簡體   English   中英

將JSON反序列化為動態對象時,ASP.NET獲取索引值

[英]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訪問此類屬性值。

相反,您的選擇包括:

  1. 利用JsonConvert.DeserializeObject<dynamic>(s)實際上返回一個JObject並使用其字典索引器這一事實:

     var ssObj = JsonConvert.DeserializeObject<dynamic>(s); var rolePermissionId = (string)ssObj["RolePermissions[0].RolePermissionId"]; 
  2. 如果您喜歡稍微類型化的解決方案,則可以反序列化為Dictionary<string, dynamic>

     var ssDict = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(s); var rolePermissionId = (string)ssDict["RolePermissions[0].RolePermissionId"]; 
  3. 或者,對於更靜態類型的解決方案,顯式解析為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM