json - GraphQL JSON 到 Go 结构

标签 json go graphql

我有一个如下所示的 GraphQL 查询:

{
    actor {
      entitySearch(query: "name LIKE 'SOME_NAME'") {
        results {
          entities {
            guid
          }
        }
      }
    }
  }

我不知道如何创建 Go 结构来保存返回的数据。我唯一关心的是返回的 guid 字段。

这显然行不通:

type graphQlResponse struct {
    guid string
}

有什么帮助吗?或者有没有一种方法可以简单地获取 guid 并将其存储在没有结构的字符串中?

这是完整的代码。我没有收到错误,但 guid 是一个空字符串:

package main

import (
    "context"
    "fmt"
    "log"

    "github.com/machinebox/graphql"
)

func main() {

    type graphQlResponse struct {
        guid string
    }

    // create a client (safe to share across requests)
    client := graphql.NewClient("GraphQL EndPoint")

    // make a request
    req := graphql.NewRequest(`
    {
        actor {
          entitySearch(query: "name LIKE 'SOME_NAME'") {
            results {
              entities {
                guid
              }
            }
          }
        }
      }
`)

    // set any variables
    //req.Var("key", "value")

    // set header fields
    //req.Header.Set("Cache-Control", "no-cache")
    req.Header.Set("Content-Type", "application/json")
    req.Header.Set("API-Key", "KEY_HERE")

    // define a Context for the request
    ctx := context.Background()

    // run it and capture the response
    var respData graphQlResponse
    if err := client.Run(ctx, req, &respData); err != nil {
        log.Fatal(err)
    }

    fmt.Println(respData.guid)
}

最佳答案

在 GraphQL 中,返回的 JSON 的形状将与 GraphQL 查询的形状匹配:您将有一个 “data” 字段,该字段将有一个 “actor” 子级,其中将包含“entitySearch”,依此类推。您所调用的库实际上非常小。鉴于the conventional HTTP transport format ,它uses ordinary encoding/json decoding解码响应。无论您提供什么结构,都需要能够解码“data”字段。

这意味着您需要创建一组反射(reflect) JSON 格式的嵌套结构,进而反射(reflect)您的 GraphQL 查询:

type Entity struct {
    Guid string `json:"guid"`
}
type Result struct {
    Entities Entity `json:"entities"`
}
type EntitySearch struct {
    Results Result `json:"results"`
}
type Actor struct {
    EntitySearch EntitySearch `json:"entitySearch"`
}
type Response struct {
    Actor Actor `json:"actor"`
}

fmt.Println(resp.Actor.EntitySearch.Results.Entities.Guid)

https://play.golang.org/p/ENCIjtfAJif有一个使用此结构和人工 JSON 主体的示例,尽管不是您提到的库。

关于json - GraphQL JSON 到 Go 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58017536/

相关文章:

arrays - golang中另一个结构内的结构数组

java - Spring - 为什么返回值在屏幕中显示 XML 类型?

javascript - 将 JSON 对象发布到 Web 方法 - $.ajax

go - 如何从此请求中获取 POST 值?

go - 如何通过从指针读取类型来创建实例

javascript - Apollo 客户端查询缺少字段 __typename

node.js - 使用 GraphQL 和 NodeJS 插入后的 PostgreSQL "syntax error at end of input"

laravel - 在灯塔 graphql 文件中声明变量

python - R 中的 Python "json.dumps()"等效吗?

json - jq 不能是 tsv 格式,只有数组错误