【问题标题】:Parse nested JSON in Flask在 Flask 中解析嵌套的 JSON
【发布时间】:2015-02-20 04:08:03
【问题描述】:

我有一个 REST API 端点,我需要在其中解析以下格式的传入嵌套 JSON:

        site: {
            id: '37251',
            site_name: 'TestSite',
            address: {
                'address': '1234 Blaisdell Ave',
                'city': 'Minneapolis',
                'state': 'MN',
                'zip': '55456',
                'neighborhood': 'Kingfield',
                'county': 'Hennepin',
            },
            geolocation: {
                latitude :  '41.6544',
                longitude :  '73.3322',
                accuracy: '45'
            }
        }

进入以下 SQLAlchemy 类:

网站:

class Site(db.Model):
    __tablename__ = 'site'
    id = Column(Integer, primary_key=True, autoincrement=True)
    site_name  = Column(String(80))# does site have a formal name
    address_id = Column(Integer, ForeignKey('address.id'))
    address = relationship("Address", backref=backref("site", uselist=False))
    geoposition_id = Column(Integer, ForeignKey('geoposition.id'))
    geoposition = relationship("Geoposition", backref=backref("site", uselist=False))
    evaluations = relationship("Evaluation", backref="site")
    site_maintainers = relationship("SiteMaintainer", backref="site")

地址(一个站点有一个地址):

class Address(db.Model):
    __tablename__ = 'address'
    id = Column(Integer, primary_key=True, autoincrement=True)
    address = Column(String(80))
    city = Column(String(80))
    state = Column(String(2))
    zip = Column(String(5))
    neighborhood =  Column(String(80))
    county = Column(String(80))

和地理位置(一个站点有一个地理位置):

class Geoposition(db.Model):
    __tablename__ = 'geoposition'
    id = Column(Integer, primary_key=True, autoincrement=True)
    site_id = Column(Integer)
    latitude = Column(Float(20))
    longitude = Column(Float(20))
    accuracy = Column(Float(20))
    timestamp = Column(DateTime)

将 SQLAlchemey 数据转换为 JSON 很容易,但我需要从我的请求中解析 JSON,以便我可以附加/更新通过 POST 发送到 RESTful API 的数据。我知道如何处理非嵌套 JSON,但我将是第一个承认我在处理属于关系结构中多个表的记录的嵌套 JSON 时一无所知的人。

我已经尝试过搜索这个,没有任何运气。我能找到的最接近的是here“使用flask-restful RequestParser 进行嵌套验证”,但这并不是根据我的嵌套结构点击我需要做的事情。

【问题讨论】:

    标签: json rest parsing flask flask-sqlalchemy


    【解决方案1】:

    酷!看起来 Flask 通过请求处理程序来处理这个问题:

    有了这个 JSON:

    site: {
                    "id": "37251",
                    "site_name": "TestSite",
                    "address": {
                        "address": "1234 Blaisdell Ave",
                        "city": "Minneapolis",
                        "state": "MN",
                        "zip": "55456",
                        "neighborhood": "Kingfield",
                        "county": "Hennepin"
                    },
                    geolocation: {
                        latitude :  "41.6544",
                        longitude :  "73.3322",
                        accuracy: "45"
                    }
                }
    

    发送到此端点:

    @app.route('/api/resource', methods=['GET','POST','OPTIONS'])
    @cross_origin() # allow all origins all methods
    @auth.login_required
    def get_resource():
        # Get the parsed contents of the form data
        json = request.json
        print(json)
    
        # Render template
        return jsonify(json)
    

    我得到以下对象:

    {u'site': {u'geolocation': {u'latitude': u'41.6544', u'longitude': u'73.3322', u'accuracy': u'45'}, u'site_name': u'TestSite', u'id': u'37251', u'address': {u'city': u'Minneapolis', u'neighborhood': u'Kingfield', u'zip': u'55456', u'county': u'Hennepin', u'state': u'MN', u'address': u'1234 Blaisdell Ave'}}}
    

    更新:

    使用此代码在我的端点中进行测试可以很好地访问我的所有字典项目:

    # print entire object
    print json['site']
    
    # define dictionary item for entire object
    site = json['site']
    print site["site_name"]
    
    # print address object
    print site['address']
    
    # define address dictionary object
    address = json['site']['address']
    print address["address"]
    
    # define geolocation dictionary object
    geolocation = json['site']['geolocation']
    print geolocation["accuracy"]
    

    现在回想起来,这似乎是微不足道的。我希望这对将来的某人有所帮助。

    【讨论】:

      【解决方案2】:

      您是否有权访问并且可以编辑 JSON?

      一些编辑将有助于使其成为有效 JSON:

      1. 对键和值使用双引号
      2. {}打开和关闭JSON
      3. 删除country 行中的尾随,

      如果可以,您的 JSON 将如下所示:

      {
          "site": {
              "id": "37251",
              "site_name": "TestSite",
              "address": {
                  "address": "1234BlaisdellAve",
                  "city": "Minneapolis",
                  "state": "MN",
                  "zip": "55456",
                  "neighborhood": "Kingfield",
                  "county": "Hennepin"
              },
              "geolocation": {
                  "latitude": "41.6544",
                  "longitude": "73.3322",
                  "accuracy": "45"
              }
          }
      }
      

      解决这个问题,使用 Python 的json 处理它:

      import json
      file_handler = open('test.json', 'r')
      parsed_data = json.loads(file_handler.read())
      print parsed_data
      

      输出是一个字典,您可以轻松地对其进行迭代以验证您的数据:

      {u'site': {u'geolocation': {u'latitude': u'41.6544', u'longitude': u'73.3322', u'accuracy': u'45'}, u'site_name': u'TestSite', u'id': u'37251', u'address': {u'city': u'Minneapolis', u'neighborhood': u'Kingfield', u'zip': u'55456', u'county': u'Hennepin', u'state': u'MN', u'address': u'1234BlaisdellAve'}}}
      

      但如果您无法编辑 JSON 以使其语法更好,json.loads 将不会解析它...

      【讨论】:

      • 完美!是的,我可以访问 JSON(从 Sencha Touch Ajax 请求进行测试......发布的示例是即时制作的,因此可以轻松修改)。我认为有一种更简单的方法来处理它,而不是必须通过并单独解析所有内容。看来我是对的。
      猜你喜欢
      • 2018-08-09
      • 1970-01-01
      • 2021-07-27
      • 2018-09-12
      • 2016-07-23
      • 2021-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多