8

JSONをキーと値のペアに変換する関数をC#で作成しようとしています。アレイをサポートする必要があります。たとえば、次のJSON:

{ 
    title: title_value,
    components: [
        {
            component_id: id1,
            menu: [
                   {title: menu_title1},
                   {title: menu_title_x},
                   {id: menu_id1}    
            ]
        },
        {
             component_id: id2,
             menu: [
                   {title: menu_title2},
                   {id: menu_id2}    
             ]
        }
    ]
}

次のように変換する必要があります。

  • title = title_value
  • components.0.component_id = id1
  • components.0.menu.0.title = menu_title1
  • components.0.menu.1.title = menu_title_x
  • components.0.menu.2.id = menu_id1
  • components.1.component_id = id2
  • components.1.menu.0.title = menu_title2
  • components.1.menu.1.id = menu_id2

このタスクを実行する簡単な方法はありますか?配列とネストされた配列を考慮し始めると、ロジックが複雑になります。

4

2 に答える 2

3

http://json.codeplex.com/を調べます

私はそれがあなたが必要とすることをするのだと思います。

于 2012-05-17T23:17:29.870 に答える
1

これに対する解決策は次のとおりです。JavaScriptSerializerは、メソッドBuildVariablesListがオブジェクトをトラバースし、結果を含むディクショナリ('additionalParameters')にデータを入力するよりも、json文字列('json')からオブジェクト('o')を作成します。

    var jss = new JavaScriptSerializer();
    var o = return new DynamicJsonObject(jss.Deserialize<Dictionary<string, object>>(json));

    var additionalParameters = new Dictionary<string, string>();
    BuildVariablesList(o.GetInternalDictionary(), "", additionalParameters);

    private static string AppendToPathString (string path, object part )
    {
        return path.Trim().Length == 0 ? part.ToString() : path + '.' + part;
    }

    public static void BuildVariablesList(object obj, string path, Dictionary<string, string> result)
    {
        if ( obj is ArrayList)
        {
            var arrayObj = obj as ArrayList;
            for (var i = 0; i<arrayObj.Count; i++ )
            {
                BuildVariablesList(arrayObj[i], AppendToPathString(path,i), result);
            }
        }else if ( obj is Dictionary<string, object>)
        {
            var dictObject = obj as Dictionary<string, object>;
            foreach (var entry in dictObject)
            {
                if (entry.Value is String && (path.Trim().Length > 0 || !ReservedFieldNames.Contains( entry.Key.ToLower())))
                {
                    result.Add(AppendToPathString(path,entry.Key), entry.Value as String);
                }
                else if (entry.Value is Dictionary<string, object>)
                {
                    BuildVariablesList(entry.Value as Dictionary<string, object>, AppendToPathString(path, entry.Key), result);
                }
                else if (entry.Value is ArrayList)
                {
                    BuildVariablesList(entry.Value as ArrayList, AppendToPathString(path, entry.Key), result);
                }
            }
        }            
    }
于 2012-05-18T21:51:07.653 に答える