Flask框架中JSON数据的解析、存储与接口返回实现

宋时安
宋时安
发布时间:2026-10-13 | 6人浏览过
原创

本文详细解析在Flask框架下处理JSON数据的完整流程。以城市数据为例,展示如何从API获取嵌套JSON结构,分析字段后拆分存入MySQL数据库,并利用Flask-RESTful库构建API接口,将数据库中的城市信息重新序列化为标准JSON格式返回给前端用户。

本文通过一个具体实例,详细介绍在Flask框架中如何处理JSON数据的获取、存储以及接口返回操作。内容旨在为开发者提供清晰的参考思路,帮助理解相关技术实现。

Flask JSON数据处理流程概述

为了便于说明,我们以某票务网站的城市数据接口为例。面对获取到的复杂JSON数据,首要步骤是保持冷静,系统地分析其结构。

第一步是深入分析JSON数据结构。观察发现,数据主要包含两个顶层字段:'returnCode'和'returnValue'。其中,'returnCode'通常用于状态码定义,而'returnValue'则包含实际的业务数据,后者是我们需要重点处理的部分。

第二步是设计数据库表结构。我们需要从'returnValue'字段中提取关键信息,将其映射为数据库表。具体而言,数据包含按城市拼音首字母(如'A')分类的列表,以及每个城市的具体信息对象。因此,我们需要设计相应的表结构来存储这些数据。

第三步是将获取到的JSON数据拆分,并插入到设计好的数据库中。这一步涉及数据清洗、转换以及批量写入数据库的操作,确保数据持久化存储。

第四步是从数据库中读取已存储的数据,并将其转换为JSON格式返回给用户。这通常通过编写API接口实现,确保前端能够以标准的JSON格式接收数据。

原始JSON数据结构分析

首先,我们需要获取原始数据。原始数据通常包含从A到Z所有拼音首字母开头的城市信息,此处以A开头的城市数据为例进行展示。


}
 "returnCode": "0",
 "returnValue": {
  "A": [
   {
    "id": 3643,
    "parentId": 0,
    "regionName": "阿坝",
    "cityCode": 513200,
    "pinYin": "ABA"
   },
   {
    "id": 3090,
    "parentId": 0,
    "regionName": "阿克苏",
    "cityCode": 652901,
    "pinYin": "AKESU"
   },
   {
    "id": 3632,
    "parentId": 0,
    "regionName": "阿拉善",
    "cityCode": 152900,
    "pinYin": "ALASHAN"
   },
   {
    "id": 899,
    "parentId": 0,
    "regionName": "安康",
    "cityCode": 610900,
    "pinYin": "ANKANG"
   },
   {
    "id": 196,
    "parentId": 0,
    "regionName": "安庆",
    "cityCode": 340800,
    "pinYin": "ANQING"
   },
   {
    "id": 758,
    "parentId": 0,
    "regionName": "鞍山",
    "cityCode": 210300,
    "pinYin": "ANSHAN"
   },
   {
    "id": 388,
    "parentId": 0,
    "regionName": "安顺",
    "cityCode": 520400,
    "pinYin": "ANSHUN"
   },
   {
    "id": 454,
    "parentId": 0,
    "regionName": "安阳",
    "cityCode": 410500,
    "pinYin": "ANYANG"
   }
  ],

原始数据示例中,省略了B到Z的其他大写字母开头的城市,仅展示A开头的城市列表。每个城市包含id、parentId、regionName、cityCode和pinYin等字段。

数据库模型设计与外键关联

接下来,我们需要在models.py中定义表结构,并建立外键关系。通过定义Letter模型和City模型,确保城市数据与首字母之间建立关联,便于后续查询和管理。


from App.ext import db
#定义城市名大写字母类,在数据的最外层
class Letter(db.Model):
  id = db.Column(db.Integer,primary_key =True,autoincrement=True)
  letter = db.Column(db.String(8),unique=True,nullable=False)
#定义城市类,嵌套层
class City(db.Model):
  id = db.Column(db.Integer,primary_key = True,autoincrement = True)
  parentId = db.Column(db.Integer,nullable = False,defaut=0)
  regionName = db.Column(db.String(30),nullable = False)
  cityCode = db.Column(db.Integer)
  pinYin = db.Column(db.String(128))
  #建立外键‘首字母'
  first_letter = db.Column(db.String(8),db.ForeignKey(Letter.letter))

数据插入数据库的实现

在addcities.py文件中,我们编写代码将数据插入数据库。通过连接MySQL数据库,读取JSON文件,遍历数据并执行插入操作,确保数据准确存入数据库。


from flask_restful.representations import json
from sqlalchemy.dialects.mysql import pymysql
def add_cities():
#链接数据库
  db = pymysql.Connect(host= '10.0.118.135',user = 'root',password ='xxxxxxx',database = 'tpp6666',port = 3306)
  cursor = db.cursor()
  #读取拿到的数据,遍历数据
  with open('citylist.json')as cl:
    returnValue = json.load(cl).get('returnValue')
    for key in returnValue:
      for city in returnValue.get(key):
         db.begin()
         #插入数据,以每一个大写字母为一个字段插入,以字典的形式
         cursor.execute(
           'insert into city(id,parentId,regionName,cityCode,pinYin,first_letter) values({},{},"{}",{},"{}","{}");'.format(
             city['id'], city['parentId'], city['regionName'], city['cityCode'], city['pinYin'], key))
         db.commit()
if __name__ == '__main__':
  add_cities()

API接口开发与JSON返回

在CityAPI.py文件中,我们定义API接口,从数据库读取数据并以JSON形式返回。利用Flask-RESTful库,我们可以方便地定义字段格式和序列化规则,确保返回数据的结构符合前端需求。


from flask_restful import Resource, fields, marshal_with
from App.models import Letter, City
#字段的格式化:
city_fields = {
  'id': fields.Integer,
  '父编号': fields.Integer(attribute='parentId'),#起别名attribute
  '名称': fields.String(attribute='regionName'),
  '拼音': fields.String(attribute='pinYin'),
  '城市编码': fields.Integer(attribute='cityCode'),
  '首字母': fields.String(attribute='first_letter')
}
value_fields = {
  'A': fields.List(fields.Nested(city_fields)),
  'B': fields.List(fields.Nested(city_fields)),
  'C': fields.List(fields.Nested(city_fields)),
  'D': fields.List(fields.Nested(city_fields)),
  'E': fields.List(fields.Nested(city_fields)),
  'F': fields.List(fields.Nested(city_fields)),
  'G': fields.List(fields.Nested(city_fields)),
  'H': fields.List(fields.Nested(city_fields)),
  'J': fields.List(fields.Nested(city_fields)),
  'K': fields.List(fields.Nested(city_fields)),
  'L': fields.List(fields.Nested(city_fields)),
  'M': fields.List(fields.Nested(city_fields)),
  'N': fields.List(fields.Nested(city_fields)),
  'P': fields.List(fields.Nested(city_fields)),
  'Q': fields.List(fields.Nested(city_fields)),
  'R': fields.List(fields.Nested(city_fields)),
  'S': fields.List(fields.Nested(city_fields)),
  'T': fields.List(fields.Nested(city_fields)),
  'W': fields.List(fields.Nested(city_fields)),
  'X': fields.List(fields.Nested(city_fields)),
  'Y': fields.List(fields.Nested(city_fields)),
  'Z': fields.List(fields.Nested(city_fields)),
}
result_fields = {
  'returnCode': fields.Integer,
  'returnValue': fields.Nested(value_fields)
}
#整体逻辑定义都在这里:
@marshal_with是flask内置的Json序列化的方法,

需要注意的是,在Django框架中,JSON序列化通常使用json.dumps()方法。而在Flask中,我们更倾向于使用Flask-RESTful提供的marshal_with装饰器来实现更灵活的JSON序列化。


class CityResrouce(Resource):
  @marshal_with(result_fields)
  def get(self):
    #定义外层字段为空字典{},存放数据
    returnValue = {}
    # 拿到所有的首字母
    letters = Letter.query.all()
    for letter in letters:
      # 根据首字母拿到每个首字母对应的所有城市
      # filter拿到的结果是一个BaseQuery对象。
      # 如果直接答应BaseQuery对象,它会输出SQL语句
      # 如果想要打印BaseQuery里的所有数据,调用all()方法可以拿到BaseQuery里的所有数据
      cities = City.query.filter(City.first_letter == letter.letter)
      # dict = {letter.letter: cities}
      # print(dict)
      returnValue[letter.letter] = cities.all()
    return {'returnCode': 0, 'returnValue': returnValue}

 

API路由配置与初始化

在api_init.py文件中,我们初始化API对象,并将CityResrouce资源添加到API路由中。通过配置路由,前端可以通过特定的URL访问城市数据接口。


from flask_restful import Api
from App.Apis.CityAPI import CityResrouce
from App.Apis.UserAPI import UerResource
api = Api()
def init_api(app):
  api.init_app(app=app)
api.add_resource(CityResrouce, '/cities/')

希望本文所述的Flask框架JSON数据处理示例,能对基于Flask进行Python程序开发的读者有所帮助,提供实用的技术参考。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表