Python 3 json.loads - json.decoder错误

时间:2016-08-12 11:28:05

标签: python python-3.x

我正在尝试解析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'

2 个答案:

答案 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')) 

为我解决了同样的问题。