带数字键的动态json对象

我有一个json对象,我在这个答案的帮助下转换为动态C#对象。 它工作得很好,但麻烦的是这个对象有数字键。 例如,

var jsStr = "{address:{"100": {...}}}"; 

所以我不能这么做

 dynObj.address.100 

而且,据我所知,我不能使用索引器来获取这样的对象

 dynObj.address["100"] 

请向我解释如何让这个工作。

据我所知,他从源代码中通过私有字典解析属性,因此您必须使用reflection来访问字典键,或者稍微修改一下代码,以便DynamicJSONObject中的TryGetMember如下(并使用__numeric__来获取密钥,例如data.address .__ numeric__100,然后避免使用__numeric__作为密钥):

 public override bool TryGetMember(GetMemberBinder binder, out object result) { var name = binder.Name; //Code to check if key is of form __numeric__ so that numeric keys can be accessed if (binder != null && binder.Name != null && binder.Name.StartsWith("__numeric__")) { name = binder.Name.Substring(11); } if (!_dictionary.TryGetValue(name, out result)) { // return null to avoid exception. caller can check for null this way... result = null; return true; } var dictionary = result as IDictionary; if (dictionary != null) { result = new DynamicJsonObject(dictionary); return true; } var arrayList = result as ArrayList; if (arrayList != null && arrayList.Count > 0) { if (arrayList[0] is IDictionary) result = new List(arrayList.Cast>().Select(x => new DynamicJsonObject(x))); else result = new List(arrayList.Cast()); } return true; } 

我的开源框架ImpromptuInterface具有通过任何C#4动态对象的字符串名称调用动态成员的方法。

 object tOut =Impromptu.InvokeGet(dynObj.address,"100"); 

我用ExpandoObject测试它似乎工作得很好。

标识符必须以字母,下划线(_)或美元符号($)开头; 后续字符也可以是数字(0-9)。 因为JavaScript区分大小写,所以字母包括字符“A”到“Z”(大写)和字符“a”到“z”(小写)。 从JavaScript 1.5开始,ISO 8859-1或Unicode字母(或\ uXXXX Unicode转义序列)可用于标识符。

引用自: http : //en.wikipedia.org/wiki/JavaScript_syntax#Variables

哦,我很抱歉错误地理解了这个问题,在这里你可以通过一个有效的例子来调整你的需求:

  

btw键可以是数字(如答案中的示例所示),只有标识符不能。 所以你必须像你尝试过一样访问。 你只需要保留数字键的引号! 并且你的json字符串不会是没有评估的对象,所以在这个例子中它严格来说是一个javascript对象而不是json但是它对于主题并不重要