1. ホーム
  2. python-3.x

[解決済み】 raise TypeError(repr(o) + " is not JSON serializable")

2022-02-11 15:42:43

質問

私はこのプロジェクトに基づいて、いくつかのコードをモデル化しようとしています。 https://auth0.com/blog/developing-restful-apis-with-python-and-flask/#bootstrapping-flask

これは私の初めてのpythonによるREST APIです。 以下はそのコードです。

from marshmallow import Schema, fields

class Product():
  def __init__(self, ident, name, description, category):
      self.ident = ident
      self.name = name
      self.description = description
      self.category = category

  def __repr__(self):
      return '<Expense(name={self.description!r})>'.format(self=self)

class ProductSchema(Schema):
      ident = fields.Str()
      name = fields.Str()
      category = fields.Str()
      description = fields.Str()

index.py

from flask import Flask, jsonify, request
from server.model.product import Product, ProductSchema

app = Flask(__name__)

products=[Product('a','b','c','d')]


@app.route("/")
def hello_world():
      return "Hello, World!"

@app.route("/products", methods=['POST'])
def add_product():
    product = ProductSchema().load(request.get_json())
    products.append(product.data)
    return "", 204

@app.route("/products")
def get_products():
    schema = ProductSchema(many=True)
    return jsonify(products)

if __name__ == "__main__":
    app.run()

しかし、/productsに対してhttp GETリクエストをしようとすると、記述のようなエラーが発生します。

どうすればいいですか?

2つの問題があります。

  1. products の型はリストであり、jsonifyはセキュリティ上、結果リストにならない。
  2. Product() オブジェクトはクラスであり、dictを返す必要があります。

でコードを変更してください。

import json
@app.route("/products")
def get_products():
    schema = ProductSchema(many=True)
    return json.dumps([p.__dict__ for p in prodacts])

または

from flask import Response
import json

    @app.route("/products")
    def get_products():
        schema = ProductSchema(many=True)
        return Response(json.dumps([p.__dict__ for p in prodacts]), mimetype='application/json')