[英]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.