Python 2.7:加载JSON文件搜索值,替换它,并保存为新的JSON

时间:2017-06-12 20:44:41

标签: json python-2.7 search recursion load

正如标题中所提到的,我试图创建一个可以从终端运行的简单py脚本来执行以下操作:

  • 查找当前工作目录和嵌套文件夹中的所有JSON文件(此部分工作正常)
  • 加载所述文件
  • 递归搜索特定值或子字符串
  • 如果值匹配,请将其替换为用户新建立的值
  • 完成后,将所有已修改的json文件保存到"已转换的"当前目录中的文件夹。

那说,问题是当我尝试下面发布的递归搜索方法时,因为我对python很新,我会很感激这个问题的任何帮助,我想它是...要么是json我正在使用的文件或使用的搜索方法。

简化问题,我搜索的值永远不会与对象内的任何内容匹配,是一个键或纯粹的一些字符串值。尝试了多种方法来执行递归搜索,但无法获得匹配。

例如:考虑样本json,我想替换值" selectable_parts"或" static_parts"甚至更深层次的结构" 1h_mod310_door_00"但似乎我的搜索方法无法在" object [object] [children] [0] [children] [5] [name]" (希望这有帮助)。

示例JSON:(https://drive.google.com/open?id=0B2-Bn2b0ujjVdW5YVGg3REg3OWs

await Navigation.PushAsync(new YourMasterPage());
var pages = Navigation.NavigationStack.ToList();
foreach (var page in pages)
{
    if (page.GetType() != typeof(YourMasterPage))
        Navigation.RemovePage(page);
}

1 个答案:

答案 0 :(得分:0)

问题是我导航json obj的方式,因为该方法没有考虑是否是dict或列表(我相信......)。

所以回答我自己的问题是我用来检查值的递归搜索:

def get_recursively(search_dict, field):
    """
    Takes a dict with nested lists and dicts,
    and searches all dicts for a key of the field
    provided.
    """
    fields_found = []

    for key, value in search_dict.iteritems():

        if key == field:
            print value
            fields_found.append(value)

        elif isinstance(value, dict):
            results = get_recursively(value, field)
            for result in results:
                if SEARCH_KEY in result:
                    fields_found.append(result)

        elif isinstance(value, list):
            for item in value:
                if isinstance(item, dict):
                    more_results = get_recursively(item, field)
                    for another_result in more_results:
                        if SEARCH_KEY in another_result:
                            fields_found.append(another_result)

    return fields_found
    # write_file(js_file, js_file_name)

希望这有助于某人。