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

如何将Scala的Map[String, Seq[String]]转换为GraphQL Sangria的MapType

解决Scala Map[String, Seq[String]]转Sangria GraphQL类型的问题

嘿,我来帮你搞定这个转换问题!你尝试用ScalarType[Map[String, Seq[String]]]的思路其实不太对——因为ScalarType是用来定义标量类型的(比如String、Int这种不可拆分的基础类型),而你的Map[String, Seq[String]]是嵌套的复合结构,完全不适合用标量类型来处理。

正确的做法是利用Sangria内置的MapType和ListType来组合出你需要的类型,具体分两种场景:

1. 作为输出类型(返回给客户端的字段)

如果你是要把这个Map作为GraphQL对象的输出字段,直接用MapType嵌套ListType(StringType)即可:

import sangria.schema._

// 定义对应的GraphQL类型
val stringListMapType: MapType[String, Seq[String]] = 
  MapType(ListType(StringType), StringType)

// 把它用到你的ObjectType字段里
val MyModelType = ObjectType(
  "MyModel",
  fields[Unit, MyModel](
    Field(
      name = "myNestedMap",
      fieldType = stringListMapType,
      resolve = ctx => ctx.value.myMap // 这里假设MyModel里有个myMap字段是Map[String, Seq[String]]类型
    )
  )
)

2. 作为输入类型(客户端传入的参数)

如果这个Map是客户端要传入的输入参数,那得用InputMapType来定义:

import sangria.schema._

val stringListInputMapType: InputMapType = 
  InputMapType(InputListType(StringType), StringType)

// 用到InputObjectType或者直接作为查询参数
val MyInputType = InputObjectType(
  "MyInput",
  fields[Unit](
    InputField("filterMap", stringListInputMapType)
  )
)

简单来说,Sangria的类型系统是分层的:复合类型(比如Map、List)需要用对应的类型构造器(MapType/ListType)去嵌套基础类型(StringType),而标量类型只用来处理最基础的不可拆分数据。

内容的提问来源于stack exchange,提问作者Orlando Del Rio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:14:43