带数字键的动态json对象

时间:2011-06-17 14:51:41

标签: c# json dynamic key numerical

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

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

所以我不能这样做

dynObj.address.100  

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

dynObj.address["100"]  

请向我解释我如何才能使其发挥作用。

3 个答案:

答案 0 :(得分:2)

据我所知,他从源代码中通过私有字典解析属性,因此您必须使用反射来访问字典键,或者稍微修改一下代码,以便DynamicJSONObject中的TryGetMember如下(和使用__nume__获取密钥,例如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__<number> 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<string, object>;
            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<string, object>)
                    result = new List<object>(arrayList.Cast<IDictionary<string, object>>().Select(x => new DynamicJsonObject(x)));
                else
                    result = new List<object>(arrayList.Cast<object>());
            }

            return true;
        }

答案 1 :(得分:1)

我的开源框架ImpromptuInterface具有call dynamic members via string name任何C#4动态对象的方法。

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

我用ExpandoObject进行了测试,似乎工作正常。

答案 2 :(得分:0)

  

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

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

哦,我很抱歉错误地理解了这个问题,在这里,您可以通过一个可以根据您的需求调整的工作示例:

<script>
var jsStr = {address:{'100': 'test'}};
var test = jsStr.address;
console.log(test);
alert(test[100]);        
</script>

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