3

私はこの答えの助けを借りて動的C#オブジェクトに変換したjsonオブジェクトを持っています。正常に動作しますが、このオブジェクトに数値キーがあるという問題があります。例えば、

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文字列は評価なしではオブジェクトにならないため、この例では厳密に言えばjsonではなくjavascriptオブジェクトですが、件名には関係ありません

于 2011-06-17T14:56:27.267 に答える