【问题标题】:any workaround to easily validate nested JSON response in python?任何解决方法可以轻松验证 python 中的嵌套 JSON 响应?
【发布时间】:2020-08-14 05:29:17
【问题描述】:

在flask-restplus中,我使用api.model装饰器定义了响应体数据结构,我期望api函数的输出应该产生我定义的精确数据结构。我不知道如何准确地做到这一点。谁能指出我如何验证烧瓶中的 json 响应内容?使用定义的模式验证 json 响应输出的任何解决方法?有什么想法吗?

当前输出

这是我向 api 函数发出 POST 请求后的当前输出:myfunc:

"{\n\r\n  \"score\": [72.188, 62.0955, 19.3374, 45.6086, 77.8891, 22.188, 45.9938, 91.9877, 14.2527, 1.5408, 62.5578],\n\r\n  \"category\": \"low\",\n\r\n  \"direction\": \"text description\",\n\r\n  \"is_ready\": true,\n\r\n  \"features_used\": {\n\r\n    \"name\": \"heart_rate\",\n\r\n    \"value\": null,\n\r\n    \"range_value\": [3.6667, 5, 6.3333, 7.6667, 9, 10.3333, 11.6667, 13, 14.3333],\n\r\n    \"range_frequency\": [0.0024, 0, 0.0049, 0.0016, 0.0073, 0.0195, 0.0098, 0.0138, 0.9406],\n\r\n    \"level\": 0\n\r\n  }\n\r\n} \n"

问题是当前输出的格式没有产生定义的响应正文。如何解决这个问题?如何验证烧瓶中的 json 响应内容?任何可能的方法来实现这一点?谢谢

具有指定响应 json 正文的最小 api

from flask import Flask, jsonify
from flask_restplus import Namespace, Resource, fields, reqparse
from flask_restplus import Api

app = Flask(__name__)
api = Api(app)

ns = api.namespace('hello-world')

used_features = {}
used_features['name'] = fields.String(attribute='name')
used_features['value'] = fields.Integer(attribute='value')
used_features['range_value'] = fields.List(
    fields.Integer, attribute='range_value')
used_features['range_frequency'] = fields.List(
    fields.Integer, attribute='range_frequency')
used_features['level'] = fields.Integer(attribute='level')

used_features_payload = api.model('feature_payload', used_features)

response_body= api.model('response', {
    'score': fields.Integer,
    'category': fields.String,
    'direction': fields.String,
    'is_ready': fields.Boolean,
    'features_used': fields.Nested(used_features_payload)
})

目标

我想验证当前输出的 JSON 模式。如何使用响应正文 JSON 模式验证函数输出?有什么想法吗?

【问题讨论】:

  • 您的post 方法正在对变量res 进行字符串化,您是否要改为return jsonify(res)

标签: python json validation flask


【解决方案1】:

忽略代码中的技术细节,

要验证您的 JSONschema 或任何已定义的架构,您可以使用 JSONscheme 包。

这个包使用起来相当简单。 在这里引用部分用法。

    schema = {
   "type" : "object",
   "properties" : {
    "price" : {"type" : "number"},
    "name" : {"type" : "string"},
     },
 }

您可以像这样定义架构,并且您可以传递您的对象来验证此架构。如果不匹配,验证器将抛出异常。

from jsonschema import validate
validate(instance={"name" : "Eggs", "price" : 34.99}, schema=schema)

【讨论】:

  • 谢谢,但是如果您按照我上面的尝试,您能否详细说明您的答案?你的方法对我的尝试有什么作用?有什么进一步的想法吗?谢谢
  • 您的尝试对我的response body 架构有何影响?如何在没有硬编码的情况下使用jsonschema 验证我当前的输出?
  • 您能否展示如何通过您的尝试验证上面的响应输出?如何验证上面的嵌套响应输出?你能详细说明你对分配赏金分数的想法吗?非常感谢
  • 您能提供一个示例 json 文档,这是您的结果吗?那么我可以帮助您创建用于验证的架构
【解决方案2】:

你可以用棉花糖来验证你的回答。我发现你的问题如下:

from marshmallow import Schema, fields, post_load
from marshmallow import EXCLUDE
import json
from flask import jsonify

class Feature:
    def __init__(self, name, value, range_value, range_frequency, importance):
        self.name = name
        self.value = value
        self.range_value = range_value
        self.range_frequency = range_frequency
        self.importance = importance

class FeatureSchema(Schema):
    value = fields.Integer()
    name = fields.Str()
    importance = fields.Integer()
    range_value = fields.List(fields.Integer)
    range_frequency = fields.List(fields.Integer)
    @post_load
    def make_feature(self, data, **kwargs):
        return Feature(**data)

class App(object):
    def __init__(self, score, category, guidance, readiness, features_used):
        self.score = score
        self.category = category
        self.guidance = guidance
        self.readiness = readiness
        self.features_used = features_used

class RespSchema(Schema):
    score = fields.Integer()
    category = fields.Str()
    guidance = fields.Str()
    readiness = fields.Boolean()
    features_used = fields.List(fields.Nested(FeatureSchema))
    @post_load
    def make_app(self, data, **kwargs):
        return App(**data)

marshmallow 非常适合用于数据验证。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 2018-07-15
    相关资源
    最近更新 更多