Flask与Graphene解析外部API JSON响应返回空值问题排查
问题根因
字段全部返回null是因为resolver的返回值不符合Graphene的类型要求:
- 你定义的
red字段类型是RedObjectType,Graphene会尝试从resolver返回值上读取redName、accessLevel、numBytes三个属性来填充响应 - 你当前代码最后返回的是
json.dumps(resp),这是序列化后的JSON字符串,字符串对象上不存在这三个属性,Graphene读取不到对应值就会全部返回null - 额外潜在问题:如果你的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
相关产品推荐
相关产品推荐

