jQuery解析Flask后端JSON并自定义格式化显示求助
实现思路与代码示例
我来帮你梳理一下如何用jQuery从Flask后端获取Yummly API的JSON数据,并实现你需要的所有展示、自定义操作功能——刚好我之前做过类似的对接项目,直接上干货:
1. Flask后端处理Yummly API并返回JSON
首先后端要正确调用Yummly API,把拿到的结果原封不动(或按需预处理)转成JSON返回给前端。假设你已经有Yummly的API密钥和APP ID,示例代码如下:
from flask import Flask, jsonify import requests app = Flask(__name__) # 替换成你的Yummly凭证 YUMMLY_API_KEY = "你的API密钥" YUMMLY_APP_ID = "你的APP ID" YUMMLY_BASE_URL = "https://api.yummly.com/v1/api/recipes" @app.route('/get-yummly-data') def get_yummly_data(): # 这里可以自定义搜索参数,比如搜"chicken" request_params = { "q": "chicken", "app_id": YUMMLY_APP_ID, "app_key": YUMMLY_API_KEY } # 调用Yummly API yummly_response = requests.get(YUMMLY_BASE_URL, params=request_params) # 把结果转成Flask的JSON响应返回给前端 return jsonify(yummly_response.json()) if __name__ == '__main__': app.run(debug=True)
2. 前端jQuery实现JSON展示与自定义操作
接下来前端用jQuery获取数据,同时实现易读格式化、单独访问字段、自定义清理、独立区块展示这些功能,代码里加了详细注释:
<!DOCTYPE html> <html> <head> <title>Yummly JSON Viewer</title> <script src="https://code.jquery.com/jquery-3.6.4.min.js"></script> <style> .main-container { margin: 20px; } .json-display { padding: 15px; border: 1px solid #eee; border-radius: 6px; margin: 10px 0; } .action-btn { padding: 8px 14px; margin: 5px; cursor: pointer; border: none; border-radius: 4px; background: #2563eb; color: white; } .selected-block { margin-top: 20px; padding: 12px; background: #f8fafc; border-left: 4px solid #2563eb; border-radius: 0 4px 4px 0; } pre { white-space: pre-wrap; word-wrap: break-word; } </style> </head> <body> <div class="main-container"> <h1>Yummly 食谱数据浏览器</h1> <button class="action-btn" id="fetch-data-btn">获取Yummly数据</button> <!-- 完整JSON展示区 --> <div class="json-display" id="full-json-area"></div> <!-- 自定义操作按钮容器(动态生成) --> <div id="action-buttons"></div> <!-- 选定内容独立展示区 --> <div id="selected-content"></div> </div> <script> $(document).ready(function() { // 存储完整的JSON数据,方便后续操作 let rawJsonData = null; // 点击按钮获取后端数据 $('#fetch-data-btn').click(function() { $.get('/get-yummly-data', function(data) { rawJsonData = data; // 格式化并展示完整JSON displayFullJson(data); // 生成自定义操作按钮 generateCustomButtons(); }).fail(function(err) { alert('数据获取失败:' + err.statusText); }); }); // 格式化展示完整JSON function displayFullJson(data) { // JSON.stringify的第二个参数为null,第三个参数是缩进空格数,实现易读格式 const formattedJson = JSON.stringify(data, null, 2); $('#full-json-area').html(`<h3>完整JSON数据</h3><pre>${formattedJson}</pre>`); } // 生成自定义操作按钮 function generateCustomButtons() { const btnGroup = $('<div></div>'); // 按钮1:查看总匹配食谱数 btnGroup.append('<button class="action-btn" id="show-total">显示总食谱数</button>'); // 按钮2:查看所有食谱条目 btnGroup.append('<button class="action-btn" id="show-recipes">显示食谱列表</button>'); // 按钮3:清理冗余字段(比如移除attribution、facetCounts) btnGroup.append('<button class="action-btn" id="clean-json">清理冗余数据</button>'); $('#action-buttons').html(btnGroup); } // 单独访问JSON字段并展示 $(document).on('click', '#show-total', function() { if (rawJsonData) { const totalCount = rawJsonData.totalMatchCount; addSelectedBlock('总食谱匹配数', `<p>共找到 <strong>${totalCount}</strong> 条符合条件的食谱</p>`); } }); $(document).on('click', '#show-recipes', function() { if (rawJsonData && rawJsonData.matches) { const formattedRecipes = JSON.stringify(rawJsonData.matches, null, 2); addSelectedBlock('食谱匹配列表', `<pre>${formattedRecipes}</pre>`); } }); // 自定义移除字段并展示 $(document).on('click', '#clean-json', function() { if (rawJsonData) { // 复制原数据,避免修改源对象 const cleanedData = {...rawJsonData}; // 移除不需要的字段,可根据需求调整 delete cleanedData.attribution; delete cleanedData.facetCounts; const cleanedJson = JSON.stringify(cleanedData, null, 2); addSelectedBlock('清理后的JSON数据', `<pre>${cleanedJson}</pre>`); } }); // 添加独立展示区块 function addSelectedBlock(title, content) { const block = $(` <div class="selected-block"> <h4>${title}</h4> ${content} </div> `); $('#selected-content').append(block); } }); </script> </body> </html>
3. 核心功能说明
- 易读展示:利用
JSON.stringify(data, null, 2)给JSON添加缩进,配合<pre>标签保留格式,让层级结构一目了然。 - 单独访问JSON块/字段:通过直接访问
rawJsonData的属性(比如rawJsonData.totalMatchCount、rawJsonData.matches)提取特定内容,再单独展示。 - 自定义移除/格式化:通过复制原JSON对象(避免污染源数据),用
delete操作符移除冗余字段;如果需要格式化特定字段(比如烹饪时间、食材列表),可以遍历数组做针对性处理。 - 独立区块展示:封装
addSelectedBlock函数,把选定内容生成带标题的独立区块,追加到指定区域,方便集中查看。
4. 扩展建议
- 可以给每个食谱条目添加点击事件,单独展示该条目的详细食材、烹饪步骤等信息。
- 添加搜索框,让用户自定义Yummly的搜索关键词,传递给后端动态获取数据。
- 给格式化后的JSON添加语法高亮(比如用highlight.js),进一步提升可读性。
内容的提问来源于stack exchange,提问作者Rafal Hejnicki
相关产品推荐
相关产品推荐

