如何在Lighthouse中正确解析存储在数据表内的JSON类型字段数据?
问题解决方法
首先明确报错根源:你当前的GraphQL字段类型声明和实际返回的data字段值类型不匹配,之前的两个方案均存在类型对应错误:
- 访问器将数据库存储的JSON字符串反序列化为PHP数组后,若GraphQL字段仍声明为String类型,会返回对象而非字符串触发类型错误
[String]为字符串数组类型,与你嵌套结构的JSON对象结构不匹配,因此无法生效
方案1:需返回结构化可查询的JSON数据(推荐)
适合需要客户端可单独查询data下description、event_id等子字段的场景:
- 先在GraphQL Schema中定义与
data内部结构匹配的自定义类型:
type NotificationData { description: String! event_id: Int! }
- 将notifications对应GraphQL类型中的
data字段类型改为你定义的NotificationData:
type Notification { # 其他字段省略 data: NotificationData! }
- 保留你写的
getDataAttribute访问器即可,PHP数组会自动映射为GraphQL对象返回。
如果你使用Lighthouse作为Laravel GraphQL框架,可省略访问器编写,直接在字段上加
@json指令即可自动处理JSON字段的序列化/反序列化:data: NotificationData! @json
方案2:仅需返回原始JSON字符串
适合不需要客户端拆解子字段,直接返回完整JSON字符串的场景:
- 删除你添加的
getDataAttribute访问器,避免将JSON字符串转为数组 - 将GraphQL Schema中
data字段类型设置为String即可
内容的提问来源于stack exchange,提问作者Eng Mustafa
相关产品推荐
相关产品推荐

