繁体   English   中英

Python:在发送之前清理 JSON 中的数据

[英]Python: Sanitize data in JSON before sending

我有一个需要发送的 JSON 文件。 在发送之前,我需要进行有效性检查并替换一些特殊字符(空格和点( . ))。

问题是 Python 在我的每个字符串之前插入了u字符,服务器无法读取这些字符。 如何删除u字符并进行数据卫生(字符替换)?

原始 JSON

{
    "columns": [
        {
            "data": "Doc.",
            "title": "Doc."
        },
        {
            "data": "Order no.",
            "title": "Order no."
        },
        {
            "data": "Nothing",
            "title": "Nothing"
        }
    ],
    "data": [
        {
            "Doc.": "564251422",
            "Nothing": 0.0,
            "Order no.": "56421"
        },
        {
            "Doc.": "546546545",
            "Nothing": 0.0,
            "Order no.": "98745"
        }
    ]
}

Python:

import json
def func():
    with open('json/simpledata.json', 'r') as json_file:
        json_data = json.load(json_file)
        print(json_data)
func()

输出 JSON:

{u'data': [{u'Nothing': 0.0, u'Order no.': u'56421', u'Doc.': u'564251422'}, {u'Nothing': 0.0, u'Order no.': u'98745', u'Doc.': u'546546545'}], u'columns': [{u'data': u'Doc.', u'title': u'Doc.'}, {u'data': u'Order no.', u'title': u'Order no.'}, {u'data': u'Nothing', u'title': u'Nothing'}]}

我试图在 Python 中实现的目标:

    sanitizeData: function(jsonArray) {
        var newKey;
        jsonArray.forEach(function(item) {
            for (key in item) {
                newKey = key.replace(/\s/g, '').replace(/\./g, '');
                if (key != newKey) {
                    item[newKey] = item[key];
                    delete item[key];
                }
            }
        })
        return jsonArray;
    },
    # remove whitespace and dots from data : <propName> references
    sanitizeColumns: function(jsonArray) {
        var dataProp = [];
        jsonArray.forEach(function(item) {
            dataProp = item['data'].replace(/\s/g, '').replace(/\./g, '');
            item['data'] = dataProp;
        })
        return jsonArray;
    }

要将 JSON 正确打印为字符串,请尝试print(json.dumps(json_data))

另见https://docs.python.org/2/library/json.html#json.dumps

要从字符串中删除某些字符,您可以做以下显而易见的事情:

string = string.replace(".", "").replace(" ", "")

或者,更有效地,使用str.translate (该示例仅适用于 python 2):

string = string.translate(None, " .")

或使用正则表达式; 重新.sub :

import re
string = re.sub(r"[ .]", "", string)

然后只需使用一个很好的理解来遍历整个字典(在 python 3 中使用items() ):

sanitize = lambda s: re.sub(r"[ .]", "", s)
table = {sanitize(k):sanitize(v) for k, v in table.iteritems()}

但这仅适用于燕子字典。 不过,看起来您的解决方案也不适用于深度嵌套的结构。 但是如果你需要,一些递归怎么样(对于 python 3 使用items()而不是iteritems()str而不是basestring ):

def sanitize(value):
    if isinstance(value, dict):
        value = {sanitize(k):sanitize(v) for k, v in value.iteritems()}
    elif isinstance(value, list):
        value = [sanitize(v) for v in value]
    elif isinstance(value, basestring):
        value = re.sub(r"[ .]", "", value)
    return value
table = sanitize(table)

我只是想为@Felk 的优秀解决方案添加一个版本。 我有一堆钥匙,里面有点。 @Felk 的解决方案从键中删除了点,但也从值中删除了 - 这是我不想要的。 因此,对于任何人 - 像我一样 - 进入这篇文章以获得仅对密钥进行消毒的解决方案,就在这里。

def sanitize(value, is_value=True):
    if isinstance(value, dict):
        value = {sanitize(k,False):sanitize(v,True) for k, v in value.items()}
    elif isinstance(value, list):
        value = [sanitize(v, True) for v in value]
    elif isinstance(value, str):
        if not is_value:
            value = re.sub(r"[.]", "", value)
    return value

table = sanitize(table)

我也想改进@Felk 和@jlaur 的优秀解决方案。

就我而言,Windows 事件日志包含未知的控制字符,这些字符没有被正确处理。

这是我的版本,它删除了所有抽象控制字符,由于输入提示而与 Python 3.6+ 兼容(可以删除以使其再次兼容 python 3.x)。

import re
from typing import Union

def json_sanitize(value: Union[str, dict, list], is_value=True) -> Union[str, dict, list]:
    """
    Modified version of https://stackoverflow.com/a/45526935/2635443

    Recursive function that allows to remove any special characters from json, especially unknown control characters
    """
    if isinstance(value, dict):
        value = {json_sanitize(k, False):json_sanitize(v, True) for k, v in value.items()}
    elif isinstance(value, list):
        value = [json_sanitize(v, True) for v in value]
    elif isinstance(value, str):
        if not is_value:
            # Remove dots from value names
            value = re.sub(r"[.]", "", value)
        else:
            # Remove all control characters
            value = re.sub(r'[\x00-\x1f\x7f-\x9f]', ' ', value)
    return value

例子:

 import json

 json_d = json.load(open('data.json', 'r'))
 json_d = json.dumps(json_d)
 print(json_d)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM