Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Wierd jsonpickle.encode行为_Python_Oop_Jsonpickle - Fatal编程技术网

Python Wierd jsonpickle.encode行为

Python Wierd jsonpickle.encode行为,python,oop,jsonpickle,Python,Oop,Jsonpickle,我正在使用jsonpickle作为我的小项目的数据库,在编码复杂类时遇到了一些奇怪的行为,基本上Book来自User实例的编码正确,但db列表中的书籍编码为奇怪的{“py/id”:4}-s。 有人能解释一下我哪里出了问题,我该如何解决 import jsonpickle from random import randint admin_ids = [302115492] def gen_id(): return randint(1, 2**64) class Book():

我正在使用
jsonpickle
作为我的小项目的数据库,在编码复杂类时遇到了一些奇怪的行为,基本上
Book
来自
User
实例的
编码正确,但db列表中的书籍编码为奇怪的
{“py/id”:4}
-s。 有人能解释一下我哪里出了问题,我该如何解决

import jsonpickle
from random import randint

admin_ids = [302115492]

def gen_id():
    return randint(1, 2**64)

class Book():
    def __init__(self, name, author, img, oid):
        self.name = name
        self.author = author
        self.img = img
        self.id = gen_id()
        self.owner_id = oid

class User():
    id = 0
    name = ""
    books = []
    requests = []

    def __init__(self, name, uid):
        self.id = uid
        self.name = name
        self.books = []

class Database():
    def __init__(self):
        self.u_dir = "users"
        self.b_dir = "books"
        self.users = []
        self.books = []
    
    def add_book(self, book):
        self.books.append(book)
        for user in self.users:
            if(user.id == book.owner_id):
                user.books.append(book)
    
    def add_user(self, user):
        self.users.append(user)

db=Database()
db.add_user(User('John',123))
db.add_book(Book('name','author','img.png',123))
print(jsonpickle.encode(db))
输出:

{
   "py/object":"__main__.Database",
   "u_dir":"users",
   "b_dir":"books",
   "users":[
      {
         "py/object":"__main__.User",
         "id":123,
         "name":"John",
         "books":[
            {
               "py/object":"__main__.Book",
               "name":"name",
               "author":"author",
               "img":"img.png",
               "id":8045585124766781176,
               "owner_id":123
            }
         ]
      }
   ],
   "books":[
      {
         "py/id":4
      }
   ]
}

显然,
jsonpickle
使用这个id东西来紧凑地存储已经存储在对象编码中某个地方的对象。要显式存储所有对象,编码时可以使用
make_refs
标志。在上面的代码中,它看起来是这样的:
print(jsonpickle.encode(db),make_refs=False)