如何将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
相关产品推荐
相关产品推荐

