You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 17:54:59