2

Python オブジェクトの JSON シリアル化をtinydbに挿入しようとしています。一度は機能し、その後は失敗します。

from tinydb import TinyDB, Query
import json

class Test:
    def __init__(self):
        self.test = "a"

    def to_JSON(self):
        return json.dumps(self, default=lambda o: o.__dict__)

db = TinyDB("test.json")
print(Test().to_JSON)
db.insert(Test().to_JSON())
print("Second insert")
db.insert(Test().to_JSON())

につながる

{"test": "a"}
Second insert
Traceback (most recent call last):
  File "test.py", line 15, in <module>
    db.insert(Test().to_JSON())
  File "/usr/lib/python3.4/site-packages/tinydb/database.py", line 287, in insert
    data = self._read()
  File "/usr/lib/python3.4/site-packages/tinydb/database.py", line 248, in _read
    return self._storage.read()
  File "/usr/lib/python3.4/site-packages/tinydb/database.py", line 38, in read
    data[eid] = Element(val, eid)
  File "/usr/lib/python3.4/site-packages/tinydb/database.py", line 20, in __init__
    self.update(value)
ValueError: dictionary update sequence element #0 has length 1; 2 is required

JSON 自体はかなり有効に見えますが、tinydb が 2 回目の挿入に失敗するのはなぜですか?

4

1 に答える 1

3

持ち方を間違えていました。json.dumps() が文字列を生成する間、insert() は dict オブジェクトを期待します。

from tinydb import TinyDB, Query
import json

class Test:
    def __init__(self):
        self.test = "a"

    def to_JSON(self):
        return json.loads(json.dumps(self, default=lambda o: o.__dict__))

db = TinyDB("test.json")
db.insert(Test().to_JSON())
print("Second insert")
db.insert(Test().to_JSON())
于 2015-12-19T19:35:09.823 に答える