Flask+MySQL生成JSON API:去除price字段嵌套JSON外层双引号
Flask + MySQL API:解决price字段JSON字符串转原生数组问题
一、修正API输出,让price成为原生JSON数组
你的SQL语句中,使用GROUP_CONCAT拼接价格后再包装成JSON对象,导致返回的price是JSON格式的字符串而非原生数组。需要改用MySQL的JSON_ARRAYAGG函数直接聚合生成JSON数组:
修改后的API代码:
@blueprint.route('/api/products', methods=['GET', 'POST']) def products(): sql = text('SELECT products.id, products.product_name, products.image_name, products.product_type, ' 'units.unit_name, categories.category_name, brands.brand_name, ' 'JSON_ARRAYAGG(JSON_OBJECT("sku", products_variation.sku, "price", products_variation.price)) AS price ' 'FROM `products` ' 'INNER JOIN products_variation ON products_variation.product_id = products.id ' 'INNER JOIN units ON units.id = products.unit_id ' 'INNER JOIN categories ON categories.id = products.category_id ' 'INNER JOIN brands ON brands.id = products.brand_id ' 'GROUP BY products.id, products.product_name, products.image_name, products.product_type, units.unit_name, categories.category_name, brands.brand_name') product_all = db.engine.execute(sql) product_schema = ProductsSchema(many=True) data = product_schema.dump(product_all) return data
关键修改点:
- 替换
JSON_ARRAY(JSON_OBJECT("price", GROUP_CONCAT(...)))为JSON_ARRAYAGG(JSON_OBJECT("sku", products_variation.sku, "price", products_variation.price)),直接让MySQL生成包含多个价格对象的JSON数组。 - 完善
GROUP BY字段:遵循MySQL的分组规则,将所有非聚合字段加入分组,避免因ONLY_FULL_GROUP_BY模式导致的报错。
修改后,API返回的price字段会变成原生JSON数组,符合你的期望格式:
"price": [{"sku": "9199G", "price": 29.99},{"sku": "9199S", "price": 27.99},{"sku": "9199B", "price": 28.99}]
二、如果无法修改SQL,解析带引号的JSON字符串
若暂时不能调整SQL,可以在Flask中使用json.loads()将price字段的JSON字符串解析为Python列表:
修改后的index函数代码:
import json import requests from flask import request, render_template @blueprint.route('/') def index(): url = request.base_url + "api/products" response = requests.get(url) products = response.json() # 遍历解析每个产品的price字段 for product in products: if product.get('price'): # 避免空值报错 product['price'] = json.loads(product['price']) print(products[0]['price']) # 此时已转为列表格式 return render_template('theme/test.html', products=products)
说明:
json.loads()会将符合JSON格式的字符串转换为对应的Python数据结构(此处是列表),之后你可以像操作普通列表一样遍历price中的元素。
内容的提问来源于stack exchange,提问作者RK Rohan
相关产品推荐
相关产品推荐

