我有一个json对象,我使用这个答案的帮助将其转换为动态的C#对象。它运行得很好,但问题是这个对象有数字键。例如,
var jsStr = "{address:{"100": {...}}}";
所以我无法编写
dynObj.address.100
据我所知,无法使用索引器以此方式获取该对象。
dynObj.address["100"]
请告诉我如何使这个工作起来。
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;
}
我的开源框架ImpromptuInterface具有通过字符串名称调用任何C# 4动态对象的方法的功能。
object tOut =Impromptu.InvokeGet(dynObj.address,"100");
我用 ExpandoObject
进行了测试,似乎工作得很好。
引用自: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,但这对主题没有影响。
dynamic
关键字访问一个属性,其中该属性的名称在 C# 中不被视为有效标识符。您引用的问题特定于Javascript。 - Donut