2016-08-18 28 views
1

所以我有一個JSON字符串,我從AJAX調用傳遞給我的控制器。我有一個索引值列表,我將其傳遞給一個動態對象。ASP.NET在將JSON反序列化爲動態對象時獲取索引值

我反序列化與

JsonConvert.DeserializeObject<dynamic>(s) 

的JSON這是從動態對象的輸出:

"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,它工作的很好,但由於某種原因,數組中的值變得無序。

任何幫助將不勝感激。謝謝!

+2

請分享您試圖反序列化的's'的值。 – Oluwafemi

回答

2

當您嘗試執行RolePermissions[0].RolePermissionId時,您試圖訪問包含索引爲0的屬性RolePermissionId的對象的嵌套集合。但是,您的JSON不代表對象的層次結構,它表示具有鍵/鍵值包含句點和括號的值對。由於c#標識符不允許這樣的字符,因此您無法直接使用dynamic訪問此類屬性值。

相反,你的選項包括:

  1. 充分利用的事實,JsonConvert.DeserializeObject<dynamic>(s)的實際返回JObject,並使用其dictionary indexer

    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"]; 
    

樣品fiddle,顯示出不同的選項。

+0

非常感謝!這種簡單易行的解決方案很容易循環。所有選項都非常棒,非常感謝!我無法贊成,因爲我的聲望不夠高,但我將其標記爲公認的答案。再次感謝! – erichunt

0

如果您正在控制通過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到控制器,以實現期望的行爲時,獲得索引值。

+0

感謝您的回答! @dbc給出的答案更多的是我正在尋找的東西,但我很欣賞答案! – erichunt

相關問題