首页 > 解决方案 > 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))    

标签: sqlpython-3.x

解决方案


这将成功去除不需要的撇号。

>>> 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 子句中,不如将它们作为单独的绑定参数传递,这样就不会出现引号问题。


推荐阅读