我正在尝试解析json,但它不起作用。 我删除了试用,除了我的代码,所以你可以看到错误Massege。
import sqlite3
import json
import codecs
conn = sqlite3.connect('geodata.sqlite')
cur = conn.cursor()
cur.execute('SELECT * FROM Locations')
fhand = codecs.open('where.js','w', "utf-8")
fhand.write("myData = [\n")
count = 0
for row in cur :
data = str(row[1])
print (data)
print (type(data))
#try:
js = json.loads(data)
#except: continue
if not('status' in js and js['status'] == 'OK') : continue
lat = js["results"][0]["geometry"]["location"]["lat"]
lng = js["results"][0]["geometry"]["location"]["lng"]
if lat == 0 or lng == 0 : continue
where = js['results'][0]['formatted_address']
where = where.replace("'","")
try :
print (where, lat, lng)
count = count + 1
if count > 1 : fhand.write(",\n")
output = "["+str(lat)+","+str(lng)+", '"+where+"']"
fhand.write(output)
except:
continue
fhand.write("\n];\n")
cur.close()
fhand.close()
print (count, "records written to where.js")
print ("Open where.html to view the data in a browser")
我的问题是
js = json.loads(data)
因某些原因无法解析它,我得到以下异常:
"raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)"
我认为这是因为数据类型,但它做了一件奇怪的事情。 我要求输入类型(数据),我得到str类型,但是当我打印数据时,我得到字节类型。
代码的完整输出:
Traceback (most recent call last):
File "C:/Users/user/Desktop/Courses Online/Coursera/Using Databases with Python/geodata/geodump.py", line 17, in <module>
js = json.loads(data)
File "C:\Users\user\AppData\Local\Programs\Python\Python35-32\lib\json\__init__.py", line 319, in loads
return _default_decoder.decode(s)
File "C:\Users\user\AppData\Local\Programs\Python\Python35-32\lib\json\decoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:\Users\user\AppData\Local\Programs\Python\Python35-32\lib\json\decoder.py", line 357, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
b'{\n "results" : [\n {\n "address_components" : [\n {\n ...... long json line......
<class 'str'>
我也尝试对数据使用decode(“utf-8”),但是我收到以下错误:'str' object has no attribute 'decode'
答案 0 :(得分:0)
您正在以错误的方式将bytes
值转换为字符串:
data = str(row[1])
您强制它成为str()
对象,但对于bytes
个对象, 包含 b
前缀和引号,因为{{ 1}}对象没有bytes
方法,只有__str__
,因此您可以获得调试表示。
解码行而不转换为字符串:
__repr__
你真的不应该在你的代码中手工制作JSON / Javascript输出。只需使用data = row[1].decode('utf8')
;如果必须使用每行流式传输,您仍然可以使用json.dumps()
创建每个列表条目:
json.dump()
这使用普通import sqlite3
import json
conn = sqlite3.connect('geodata.sqlite')
cur = conn.cursor()
cur.execute('SELECT * FROM Locations')
with open('where.js', 'w', encoding="utf-8") as fhand:
fhand.write("myData = [\n")
for count, row in enumerate(row):
try:
js = json.loads(row[1].decode('utf8'))
except json.JSONDecodeError:
print('Could not decode a row: ', row[1])
continue
if js.get('status') != 'OK':
continue
lat = js["results"][0]["geometry"]["location"]["lat"]
lng = js["results"][0]["geometry"]["location"]["lng"]
if not (lat and lng):
continue
where = js['results'][0]['formatted_address']
where = where.replace("'", "")
print (where, lat, lng)
if count: fhand.write(",\n")
json.dump([lat, lng, where], fhand)
fhand.write("\n];\n")
(在Python 3中,从不需要使用open()
),将文件用作上下文管理器,并添加codecs.open()
以跟踪您是否已经处理了第一行。
答案 1 :(得分:0)
js = json.loads(data.decode('utf8'))
为我解决了同样的问题。