3

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

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

所以我写不出来

dynObj.address.100  

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

dynObj.address["100"]  

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

4

3 回答 3

2

据我从源代码中可以看出,他通过私有字典解析属性,因此您必须使用反射来访问字典键,或者稍微修改他的代码,以便 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__<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;
        }
于 2011-06-17T15:45:09.390 回答
1

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

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

我用它进行了测试,ExpandoObject它似乎工作得很好。

于 2011-06-17T20:18:27.807 回答
0

标识符必须以字母、下划线 (_) 或美元符号 ($) 开头;后续字符也可以是数字 (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>

顺便说一句,键可以是数字(如您在答案中的示例中所见),只有标识符不能。所以你必须像你尝试的那样访问。你只需要离开数字键的引号!并且你的 json 字符串不会是一个没有评估的对象,所以在这个例子中,严格来说它是一个 javascript 对象而不是 json,但它与主题无关

于 2011-06-17T14:56:27.267 回答