首页 > 解决方案 > 在 Python 中解析嵌套的 Json 以删除列中的特殊字符

问题描述

这是我的 Json 文件

{
    "highest_table": {
        "items": [{
                "key": "Human 1",
                "columns": {
                    "Na$me": "Tom",
                    "Description(ms/2)": "Table Number One on the Top",
                    "A&ge": "24",
                    "Ge_nder": "M"
                }
            },
            {
                "key": "Human 2",
                "columns": {
                    "Na$me": "John",
                    "Description(ms/2)": "Table Number One on the Top",
                    "A&ge": "23",
                    "Ge_nder": "M"
                }
                }
        ]
    }
}

目标是删除列名中的任何和所有特殊字符(或者如果更简单的话,删除 .json 文件中的任何特殊字符),并返回一个 .json 文件。我最初的想法是将其转换为 pandas,删除列标题中的特殊字符并将其转换回 .json 文件。

这是我到目前为止所尝试的。它们都只打印一行。

import json
from pandas.io.json import json_normalize    

data_file = r"C:\characters.json"

with open(data_file) as data_file:    
    data = json.load(data_file)  

df = json_normalize(data)  

--

data_file = r"C:\characters.json"

df = pd.read_json(data_file)  

如何提取列、删除特殊字符并将它们放回 .json 文件中?

标签: pythonjsonpandasparsing

解决方案


有点问答-您必须提供完整的实现,fixkey但这应该可以解决您的问题。

import json

def fixkey(key):
    # toy implementation
    #print("fixing {}".format(key))
    return key.replace("&", "").replace("$", "")

def normalize(data):
    #print("normalizing {}".format(data))
    if isinstance(data, dict):
        data = {fixkey(key): normalize(value) for key, value in data.items()}
    elif isinstance(data, list):
        data = [normalize(item) for item in data]
    return data

jsdata = """
{
    "highest_table": {
        "items": [{
                "key": "Human 1",
                "columns": {
                    "Na$me": "Tom",
                    "Description(ms/2)": "Table Number One on the Top",
                    "A&ge": "24",
                    "Ge_nder": "M"
                }
            },
            {
                "key": "Human 2",
                "columns": {
                    "Na$me": "John",
                    "Description(ms/2)": "Table Number One on the Top",
                    "A&ge": "23",
                    "Ge_nder": "M"
                }
                }
        ]
    }
}
"""


data = json.loads(jsdata)

data = normalize(data)

result = json.dumps(data, indent=2)
print(result)

推荐阅读