Python dict反序列化在python2.7中工作,在3.3中失败

Python dict反序列化在python2.7中工作,在3.3中失败,python,json,serialization,sqlite,python-3.3,Python,Json,Serialization,Sqlite,Python 3.3,我使用sqlite3表来存储python dict(utf8内容),并使用JSON完成序列化。它在python2.7中运行良好,但在3.3中失败 模式: CREATE TABLE mytable (id INTEGER, book TEXT NOT NULL, d JSON NOT NULL, priority INTEGER NOT NULL DEFAULT(3), PRIMARY KEY (id, book)) 插入值时,dict将使用json.dumps(d)进行序列化。 故

我使用sqlite3表来存储python dict(utf8内容),并使用JSON完成序列化。它在python2.7中运行良好,但在3.3中失败

模式:

CREATE TABLE mytable
  (id INTEGER, book TEXT NOT NULL, d JSON NOT NULL, priority INTEGER NOT NULL DEFAULT(3), 
   PRIMARY KEY (id, book))
插入值时,dict将使用
json.dumps(d)
进行序列化。 故障零件正在检索以前保存的值

import sys
import sqlite3
import json

filename = 'mydb.db'
sqlite3.register_converter('JSON', json.loads)
conn = sqlite3.connect(filename, detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
c = conn.cursor()
c.execute('''SELECT book, id, d, priority FROM mytable''')
print(c.fetchall())
上面的脚本在使用python2.7执行时运行良好。但是,使用3.3会出现类型错误:

Traceback (most recent call last):
  File "tests/py3error_debug.py", line 15, in <module>
    c.execute('''SELECT book, id, d, priority FROM mytable''')
  File "/usr/local/Cellar/python3/3.3.2/Frameworks/Python.framework/Versions/3.3/lib/python3.3/json/__init__.py", line 319, in loads
    return _default_decoder.decode(s)
  File "/usr/local/Cellar/python3/3.3.2/Frameworks/Python.framework/Versions/3.3/lib/python3.3/json/decoder.py", line 352, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
TypeError: can't use a string pattern on a bytes-like object
回溯(最近一次呼叫最后一次):
文件“tests/py3error_debug.py”,第15行,在
c、 执行(''SELECT book,id,d,priority FROM mytable'')
文件“/usr/local/ceral/python3/3.3.2/Frameworks/Python.framework/Versions/3.3/lib/python3.3/json/_init__.py”,第319行,加载
返回\u默认\u解码器。解码
文件“/usr/local/ceral/python3/3.3.2/Frameworks/Python.framework/Versions/3.3/lib/python3.3/json/decoder.py”,第352行,在decode中
obj,end=self.raw\u decode(s,idx=\u w(s,0.end())
TypeError:无法在类似字节的对象上使用字符串模式
我无法发现2.7和3.3JSON模块之间的本质区别(特别是关于
JSON.loads
),我已经没有什么想法了

根据:

json模块总是生成str对象,而不是字节对象

根据:

注册一个可调用函数,以将数据库中的bytestring转换为自定义Python类型

如果尝试加载ByteString json,则会得到TypeError:

>>> json.loads('"0"')
'0'
>>> json.loads(b'"0"')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.3/json/__init__.py", line 319, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python3.3/json/decoder.py", line 352, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
TypeError: can't use a string pattern on a bytes-like object
sqlite3.register_converter('JSON', lambda x: json.loads(x.decode('utf-8')))