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

Flask与Graphene解析外部API JSON响应返回空值问题排查

问题根因

字段全部返回null是因为resolver的返回值不符合Graphene的类型要求:

  1. 你定义的red字段类型是Red ObjectType,Graphene会尝试从resolver返回值上读取redName、accessLevel、numBytes三个属性来填充响应
  2. 你当前代码最后返回的是json.dumps(resp),这是序列化后的JSON字符串,字符串对象上不存在这三个属性,Graphene读取不到对应值就会全部返回null
  3. 额外潜在问题:如果你的API返回的属性名是蛇形命名(比如access_level、num_bytes),和你定义的小驼峰字段名不匹配,就算返回原始字典也会出现值为null的情况,需要手动做字段映射。
修复方案

去掉json.dumps逻辑,直接返回和Red类型字段结构匹配的字典或者Red实例即可,参考代码:

class Red(graphene.ObjectType):
    redName     = graphene.String()
    accessLevel = graphene.String()
    numBytes    = graphene.Int()


class Query(graphene.ObjectType):
    
    red = graphene.Field(Red, redName = graphene.String(required=True))


    def resolve_red(self, info, **kwargs):
        dataset_Red  = <custom library for querying API>.dataset(kwargs['redName'])
        dataset_Red.get()
        resp = dataset_Red.properties
        # 提前打印resp确认API返回的字段名,按需调整映射关系
        return {
            "redName": kwargs["redName"],
            "accessLevel": resp.get("accessLevel", resp.get("access_level")),
            "numBytes": resp.get("numBytes", resp.get("num_bytes"))
        }
额外说明
  • 如果你确实需要返回原始JSON结构,需要把对应字段的类型定义为graphene.JSONString,而不是自定义ObjectType
  • 也可以直接返回Red类实例:return Red(redName=..., accessLevel=..., numBytes=...),效果和返回字典一致
  • 调试阶段可以先在resolver里打印resp的原始内容,确认API返回的字段名、字段类型和你定义的Schema匹配,避免隐式的类型转换失败导致返回null。

内容的提问来源于stack exchange,提问作者Matt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 15:39:25