sql - JSON数据中的Python查找和替换
问题描述
API 响应包含撇号 ('),它会丢弃后续 SQL 代码。在将 JSON 对象发送到 SQL DB 之前,如何查找和替换字符?
{
"num_results": 455161,
"results": [
{
"activity_date": "1975-12-01",
"activity_id": "50",
"activity_name": "ORDERED",
"activity_remark": "FOR DELIVERY 1976-04.",
"operator_country_lar": "France",
"operator_country_lar_id": "865",
"operator_id": "2786"
},
{
"activity_date": "1974-10-01",
"activity_id": "50",
"activity_name": "ORDERED",
"activity_remark": "FOR DELIVERY 1976-04.",
"operator_country_lar": "Korea, Democratic People's Republic of",
"operator_country_lar_id": "206",
"operator_id": "29080"
}
],
"results_this_page": 2,
"status": 200}
我尝试将 JSON 转换为 str 然后 .replace(" ' ",""),但无法将数据返回到 JSON。
convert_str = str(self.response.json())
convert_str = convert_str.replace("'","")
print(json.dumps(convert_str, sort_keys=True, indent=4))
解决方案
这将成功去除不需要的撇号。
>>> d = {
'num_results': 455161,
'results': [{'activity_date': '1975-12-01',
'activity_id': '50',
'activity_name': 'ORDERED',
'activity_remark': 'FOR DELIVERY 1976-04.',
'operator_country_lar': 'France',
'operator_country_lar_id': '865',
'operator_id': '2786'},
{'activity_date': '1974-10-01',
'activity_id': '50',
'activity_name': 'ORDERED',
'activity_remark': 'FOR DELIVERY 1976-04.',
'operator_country_lar': "Korea, Democratic People's Republic of",
'operator_country_lar_id': '206',
'operator_id': '29080'}],
'results_this_page': 2,
'status': 200}
>>>
>>> pprint.pprint(json.loads(json.dumps(d).replace("'", "")))
{'num_results': 455161,
'results': [{'activity_date': '1975-12-01',
'activity_id': '50',
'activity_name': 'ORDERED',
'activity_remark': 'FOR DELIVERY 1976-04.',
'operator_country_lar': 'France',
'operator_country_lar_id': '865',
'operator_id': '2786'},
{'activity_date': '1974-10-01',
'activity_id': '50',
'activity_name': 'ORDERED',
'activity_remark': 'FOR DELIVERY 1976-04.',
'operator_country_lar': 'Korea, Democratic Peoples Republic of',
'operator_country_lar_id': '206',
'operator_id': '29080'}],
'results_this_page': 2,
'status': 200}
因为operator_country_lar
您可以使用双引号“People's”,也可以使用反击“People's”转义。
与其修改整个 JSON 字符串,您可能会发现访问每个dict
key,val
项目并修改单个val
字符串会很有帮助。例如:
for result in d['results']:
for k, v in result.items():
result[k] = v.replace("'", "")
API 响应包含撇号 ('),它会丢弃后续 SQL 代码。
这听起来像是您已经设法对自己发起了 sql 注入攻击。回想一下小鲍比桌的教训。
为正确的目的使用正确的数据库 API 很重要。与其将带引号的字符串放在 WHERE 子句中,不如将它们作为单独的绑定参数传递,这样就不会出现引号问题。
推荐阅读
- java - 覆盖超类中的 equals 方法
- debian - No write permission for groups when using samba
- python - 在函数内部使用函数及其变量作为变量
- azure-devops - 使用可选阶段标记管道状态“已完成”
- indexing - Julia:如何在另一个字符串数组中找到字符串(在字符串数组中)的位置
- linux - Sync between Linux process running at different speeds
- javascript - How to use onclick function on button. When Button has no ID and Name, it only has class?
- angular - Component with table not updating
- swift - Swift 当我使用 didSelectRowAt 时,Custom Cell 应该如何加载 tableview 数据并使其扩展?
- javascript - I need to create a Bookmarklet to run a batchfile