首先,您确实应该列出查询中的所有字段。这就是graphql的本质。它很冗长,但大多数客户端库无论如何都会从您的数据结构中获取字段,所以它还不错。
所以我建议手动列出所有字段!
但如果你坚持,如果有意愿,就有办法。您可以使用 GraphQL 的标量类型并制作自己的。有关如何使用 gqlgen 制作它们的信息,请参阅此文档:https ://gqlgen.com/reference/scalars/
在您的架构中,您可以创建一个JSON
标量:
scalar JSON
type Query {
random: JSON!
}
为此制作一个模型
// in your own models.go
// You can really play with this to make it better, easier to use
type JSONScalar json.RawMessage
// UnmarshalGQL implements the graphql.Unmarshaler interface
func (y *JSONScalar) UnmarshalGQL(v interface{}) error {
data, ok := v.(string)
if !ok {
return fmt.Errorf("Scalar must be a string")
}
*y = []byte(data)
return nil
}
// MarshalGQL implements the graphql.Marshaler interface
func (y JSONScalar) MarshalGQL(w io.Writer) {
_, _ = w.Write(y)
}
然后将标量链接到您的自定义类型gql.yml
models:
JSON:
model: github.com/your-project/path/graph/model.JSONScalar
当您运行生成(使用 gqlgen v0.11.3 或更低版本gqlgen version
)时,您的解析器现在将使用您创建的自定义类型。而且很容易使用:
func (r *queryResolver) random(ctx context.Context) (model.JSONScalar, error) {
// something is the data structure you want to return as json
something := struct {
Value string
}{
Value: "Hello World",
}
d, _ := json.Marshal(something)
return model1.JSONScalar(d), nil
}
结果查询
// Query
{
random
}
// Response
{
"random" : {
"Value": "Hello World!"
}
}