Динамический объект JSON с цифровыми клавишами - PullRequest
3 голосов
/ 17 июня 2011

У меня есть объект json, который я преобразовал в динамический объект C # с помощью этого ответа.Это работает просто отлично, но проблема в том, что этот объект имеет цифровые клавиши.Например,

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

Так что я не могу записать

dynObj.address.100  

И, как я знаю, я не могу использовать индексаторы для получения этого объекта, подобного этому

dynObj.address["100"]  

Пожалуйста, объясните мне, как я могу заставить это работать.

Ответы [ 3 ]

2 голосов
/ 17 июня 2011

Насколько я вижу из исходного кода, он разрешает свойства через частный словарь, поэтому вы должны использовать отражение для доступа к ключу словаря или немного изменить его код так, чтобы TryGetMember в DynamicJSONObject был следующим (ииспользуйте __numer__ для получения ключа, например data.address .__ numeric__100, а затем избегайте использования __numer__ в качестве ключа):

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 голос
/ 18 июня 2011

Моя инфраструктура с открытым исходным кодом ImpromptuInterface содержит методы для вызова динамических членов через строковое имя любого динамического объекта C # 4.

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

Я протестировал его с ExpandoObject, казалось, что он работает просто отлично.

0 голосов
/ 17 июня 2011

Идентификатор должен начинаться с буквы, подчеркивания (_) или знака доллара ($);последующие символы также могут быть цифрами (0-9).Поскольку JavaScript чувствителен к регистру, буквы включают символы от «A» до «Z» (заглавные буквы) и символы от «a» до «z» (строчные буквы).Начиная с JavaScript 1.5, в идентификаторах могут использоваться буквы ISO 8859-1 или Unicode (или escape-последовательности Unicode \ uXXXX).

Цитируется из: 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, но это не имеет значения для субъекта

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...