Python sql 中的 JSON 字符串更新不当
Python Improper Update of JSON string in sql
我正在进行反向地理编码并更新结果 O/P(采用 JSON 格式)并使用 [=38 更新 sql table 列=] o/p,但无法按预期正确存储或更新它。
这是进行反向地理编码后更新的内容
>pw
{'results': [{'address_components': [{'long_name': 'Nandanvan A Wing', 'short_name': 'Nandanvan A Wing', 'types': ['establishment', 'point_of_interest', 'premise']}, {'long_name': 'Shivaji Nagar Marg', 'short_name': 'Shivaji Nagar Marg', 'types': ['route']}, {'long_name': 'Vishnu Prasad Society', 'short_name': 'Vishnu Prasad Society', 'types': ['neighborhood', 'political']}, {'long_name': 'Navpada', 'short_name': 'Navpada', 'types': ['political', 'sublocality', 'sublocality_level_3']}, {'long_name': 'Parle Colony', 'short_name': 'Parle Colony', 'types': ['political', 'sublocality', 'sublocality_level_2']}, {'long_name': 'Vile ....72.8454698}}}, 'place_id': 'ChIJ1SbMGMrJ5zsRQd3_uFHHDN4', 'types': ['political', 'sublocality', 'sublocality_level_3']}], 'status': 'OK'}
但 this 实际上就是这样,
这是我使用的代码
import pyodbc
import urllib.request
import urllib.parse
import json
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=localhost;DATABASE=mydb;UID=test;PWD=test@321;autocommit=True')
cursor = cnxn.cursor()
cursor.execute("select R_GEOCODE_ID, SOURCE_PXVAL, SOURCE_PYVAL from MST_NHB_R_GEOCODE where R_GEOCODE_ID=675421")
ID=[]
px_val=[]
py_val=[]
for row in cursor.fetchall():
ID.append(row[0])
px_val.append(row[1])
py_val.append(row[2])
#
wp = urllib.request.urlopen("https://maps.googleapis.com/maps/api/geocode/json?latlng={0},{1}".format(row[1],row[2]))
pw=wp.read().decode('utf-8')
pw = json.loads(pw)
if(pw['status'] == 'OK'):
sql = 'exec [db_name].dbo.USP_GEO_UPDATE ?, ?'
values = (str(pw), row[0])
cursor.execute(sql, (values))
cnxn.commit()
cursor.close()
cnxn.close()
它正在将 JSON 完全转换为 '
引号,而反向地理编码是在 "
引号中。
对此的任何建议都会有所帮助。
谢谢。
当您执行 pw = json.loads(pw)
时,您会根据 JSON 响应创建一个 python 字典对象。当您随后对该对象调用 str()
时,您将获得 Python 字典的字符串表示形式,无效 JSON。相反,使用 json.dumps()
来创建 JSON 格式的字符串。所以,values = (json.dumps(pw), row[0])
。 dumps
和 loads
中的尾随 "s" 表示 "string"。
我正在进行反向地理编码并更新结果 O/P(采用 JSON 格式)并使用 [=38 更新 sql table 列=] o/p,但无法按预期正确存储或更新它。
这是进行反向地理编码后更新的内容
>pw
{'results': [{'address_components': [{'long_name': 'Nandanvan A Wing', 'short_name': 'Nandanvan A Wing', 'types': ['establishment', 'point_of_interest', 'premise']}, {'long_name': 'Shivaji Nagar Marg', 'short_name': 'Shivaji Nagar Marg', 'types': ['route']}, {'long_name': 'Vishnu Prasad Society', 'short_name': 'Vishnu Prasad Society', 'types': ['neighborhood', 'political']}, {'long_name': 'Navpada', 'short_name': 'Navpada', 'types': ['political', 'sublocality', 'sublocality_level_3']}, {'long_name': 'Parle Colony', 'short_name': 'Parle Colony', 'types': ['political', 'sublocality', 'sublocality_level_2']}, {'long_name': 'Vile ....72.8454698}}}, 'place_id': 'ChIJ1SbMGMrJ5zsRQd3_uFHHDN4', 'types': ['political', 'sublocality', 'sublocality_level_3']}], 'status': 'OK'}
但 this 实际上就是这样,
这是我使用的代码
import pyodbc
import urllib.request
import urllib.parse
import json
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=localhost;DATABASE=mydb;UID=test;PWD=test@321;autocommit=True')
cursor = cnxn.cursor()
cursor.execute("select R_GEOCODE_ID, SOURCE_PXVAL, SOURCE_PYVAL from MST_NHB_R_GEOCODE where R_GEOCODE_ID=675421")
ID=[]
px_val=[]
py_val=[]
for row in cursor.fetchall():
ID.append(row[0])
px_val.append(row[1])
py_val.append(row[2])
#
wp = urllib.request.urlopen("https://maps.googleapis.com/maps/api/geocode/json?latlng={0},{1}".format(row[1],row[2]))
pw=wp.read().decode('utf-8')
pw = json.loads(pw)
if(pw['status'] == 'OK'):
sql = 'exec [db_name].dbo.USP_GEO_UPDATE ?, ?'
values = (str(pw), row[0])
cursor.execute(sql, (values))
cnxn.commit()
cursor.close()
cnxn.close()
它正在将 JSON 完全转换为 '
引号,而反向地理编码是在 "
引号中。
对此的任何建议都会有所帮助。
谢谢。
当您执行 pw = json.loads(pw)
时,您会根据 JSON 响应创建一个 python 字典对象。当您随后对该对象调用 str()
时,您将获得 Python 字典的字符串表示形式,无效 JSON。相反,使用 json.dumps()
来创建 JSON 格式的字符串。所以,values = (json.dumps(pw), row[0])
。 dumps
和 loads
中的尾随 "s" 表示 "string"。