首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在gqlgen中生成标量JSON

无法在gqlgen中生成标量JSON
EN

Stack Overflow用户
提问于 2022-02-02 12:54:12
回答 1查看 857关注 0票数 2

我有一个GQL计划:

代码语言:javascript
复制
extend type MyType @key(fields: "id") {
  id: ID! @external
  properties: JSON @external
  myField: String! @requires(fields: "properties")
}
scalar JSON

在图形/模型/模型中。

代码语言:javascript
复制
package model

import (
    "encoding/json"
    "fmt"
    "io"
    "strconv"
    "strings"
)

type JSON map[string]interface{}

// UnmarshalGQL implements the graphql.Unmarshaler interface
func (b *JSON) UnmarshalGQL(v interface{}) error {
    *b = make(map[string]interface{})
    byteData, err := json.Marshal(v)
    if err != nil {
        panic("FAIL WHILE MARSHAL SCHEME")
    }
    tmp := make(map[string]interface{})
    err = json.Unmarshal(byteData, &tmp)
    if err != nil {
        panic("FAIL WHILE UNMARSHAL SCHEME")
        //return fmt.Errorf("%v", err)
    }
    *b = tmp
    return nil
}

// MarshalGQL implements the graphql.Marshaler interface
func (b JSON) MarshalGQL(w io.Writer) {
    byteData, err := json.Marshal(b)
    if err != nil {
        panic("FAIL WHILE MARSHAL SCHEME")
    }
    _, _ = w.Write(byteData)
}

但是当我运行go时,运行github.com/99 99designs/gqlgen生成错误:

代码语言:javascript
复制
generating core failed: type.gotpl: template: type.gotpl:52:28: executing "type.gotpl" at <$type.Elem.GO>: nil pointer evaluating *config.TypeReference.
GOexit status 1

我只需要获得称为JSON的映射接口{}。我知道有标量地图,但是对于阿波罗联邦来说,这个字段必须被称为JSON。

EN

回答 1

Stack Overflow用户

发布于 2022-02-02 14:10:51

应该将MarshalGQL替换为MarshalJSON,例如:

代码语言:javascript
复制
type JSON map[string]interface{}

func MarshalJSON(b JSON) graphql.Marshaler {
    return graphql.WriterFunc(func(w io.Writer) {
        byteData, err := json.Marshal(b)
        if err != nil {
            log.Printf("FAIL WHILE MARSHAL JSON %v\n", string(byteData))
        }
        _, err = w.Write(byteData)
        if err != nil {
            log.Printf("FAIL WHILE WRITE DATA %v\n", string(byteData))
        }
    })
}

func UnmarshalJSON(v interface{}) (JSON, error) {
    byteData, err := json.Marshal(v)
    if err != nil {
        return JSON{}, fmt.Errorf("FAIL WHILE MARSHAL SCHEME")
    }
    tmp := make(map[string]interface{})
    err = json.Unmarshal(byteData, &tmp)
    if err != nil {
        return JSON{}, fmt.Errorf("FAIL WHILE UNMARSHAL SCHEME")
    }
    return tmp, nil
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70955985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档