简体   繁体   中英

JSON string Replace single quote with two single quotes in Python

I'm using Python to grab a JSON response. I have a json string that has fields that contain a single quote inside of the data. I'm trying to replace a single escaped quote ' with two single quotes so that I can insert it into SQL server. The problem is, when I use:

json_str = json_string.replace("\'","''")

it is changing it to ''.

How can I massage this data so that I can get it into SQL server?

Code snippet:

import pyodbc
import json
import requests
import csv
import datetime as DT

from datetime import datetime
import pytz
from pytz import timezone

# Dates / Times
today = DT.date.today()
week_ago = today - DT.timedelta(days=2)

# Settings
auth = ''
view_tickets = []

# List tickets from a View
print(f'Getting tickets...')
url = f'https:... created>{week_ago}'

headers = {'Content-Type': 'application/json'}

while url:
   response = requests.get(url, auth=auth, headers=headers)
   page_data = response.json()

# convert json to string
json_string = json.dumps(page_data)

# remove backslashes that screw up SQL import
json_string = json_string.encode().decode('unicode_escape')

#json_str = json_string.replace("\'","''")
    
# SQL EXPRESS INSERT Process
conn=pyodbc.connect('Driver={SQL Server};Server=NY-.\SQLEXPRESS;Database=Metrics;Trusted_Connection=yes;')
conn.timeout = 60
conn.autocommit = True

# Call SQL and trap Error if raised
try:
    cursor = conn.cursor()
    # SQL string
    sql_declare = "DECLARE @json NVARCHAR(MAX) = N'" + json_str + "'"
    sql_stat = "INSERT INTO Metrics.dbo.Tickets SELECT * FROM OPENJSON(@json, '$.results') WITH (id INTEGER '$.id', subject VARCHAR(255) '$.subject')"
    sql = sql_declare + " " + sql_stat

    cursor.execute(sql)
    print('Connected to database')
    
except pyodbc.Error as err:
    print('Error !!!!! %s' % err)
except:
    print('something else failed')
    
conn.close()
print('closed db connection')

I have tried string.replace but that is not working.

Sample String:

'{"results": [{"subject": "Golf International de Longwy & Golf de Thionville Rive Droite - Add course request", "raw_subject": "Golf International de Longwy & Golf de Thionville Rive Droite - Add course request", "description": "Name GILBERT RAVAGLI\nEmail xxxxx\nPhone 00352781695321 france\n\nMessage\n\nBonjour J'ai acheter une montre Les deux golf qui sont dans mon secteur n'apparaissent pas sur la montre Le golf internationnal de Longwy et le golf de Thionville rive droite France Pouvez vous les cartographier que la montre puisse me servir? Cordialement"}], "facets": null, "next_page": null, "previous_page": null, "count": 72}'

SQL Code: DECLARE @json NVARCHAR(MAX)

SET @json = N'{"results": [{"subject": "Golf International de Longwy & Golf de Thionville Rive Droite - Add course request", "raw_subject": "Golf International de Longwy & Golf de Thionville Rive Droite - Add course request", "description": "Name GILBERT RAVAGLI\nEmail xxxxx\nPhone 00352781695321 france\n\nMessage\n\nBonjour J'ai acheter une montre IZZO SWAMI Les deux golf qui sont dans mon secteur n'apparaissent pas sur la montre Le golf internationnal de Longwy et le golf de Thionville rive droite France Pouvez vous les cartographier que la montre puisse me servir? Cordialement"}], "facets": null, "next_page": null, "previous_page": null, "count": 72}'

SELECT * FROM OPENJSON (@json)
WITH ( subject VARCHAR(250) '$.subject'
)

Shouldn't all of this:

sql_declare = "DECLARE @json NVARCHAR(MAX) = N'" + json_str + "'"
sql_stat = "INSERT ... FROM OPENJSON(@json, '$.results') ..."
sql = sql_declare + " " + sql_stat
cursor.execute(sql)

Just be:

sql = "INSERT ... FROM OPENJSON(?, '$.results') ...);"
cursor.execute(sql, json_string)

Now you're passing in a parameter and don't have to deal with local variables in T-SQL, string delimiters, single quotes, etc.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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