将 JSON.RawMessage 转换为 JSON

我正在使用gqlgen,sqlx和pgx. 我正在尝试为sqlx's使用自定义标量types.JSONText。


我jsonb在项目表中有这个属性字段。


-- migrations/001_up.sql


CREATE TABLE IF NOT EXISTS items (

    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),

    quantity INT NOT NULL,

    attributes JSONB

);

我有这些模型结构:


// graph/model/item.go


type Item struct {

    ID         string       `json:"id,omitempty" db:"id,omitempty"`

    Quantity   int          `json:"quantity" db:"quantity"`

    Attributes *Attributes  `json:"attributes,omitempty" db:"attributes,omitempty"`

}


type Attributes types.JSONText

我有这个 graphql 架构:


// graph/schema.graphql


type Item {

  id: ID!

  quantity: Int!

  attributes: Attributes

}

 

scalar Attributes

我可以成功插入数据库,但在检索时出错。


| id            | quantity | attributes                         |

|---------------|----------|------------------------------------|

| 031e1489-...  | 100      | {"size": "medium", "color": "red"} |

这是我从 db 查询中得到的日志:


>> items.Db: &{

  031e1489-02c9-46d3-924d-6a2edf1ca3ba // id

  100                                  // quantity

  0xc000430600                         // attributes

}

我试图编组属性标量:


// graph/model/item.go


...


func (a *Attributes) MarshalGQL(w io.Writer) {

    b, _ := json.Marshal(a)

    w.Write(b)

}


// Unmarshal here

...

添加自定义标量类型gqlgen.yml:


...


  Attributes:

    model:

      - github.com/my-api/graph/model.Attributes

但我得到的是字符串而不是 json:


{

  "data": {

    "item": {

      "id": "031e1489-02c9-46d3-924d-6a2edf1ca3ba",

      "quantity": 100,

      "attributes": "eyJjb2xvciI6ICJyZWQifQ==",

    }

  }

}

所需的输出是:


{

  "data": {

    "item": {

      "id": "031e1489-02c9-46d3-924d-6a2edf1ca3ba",

      "quantity": 100,

      "attributes": {

        "size": "medium",

        "color": "red",

      }

    }

  }

}

我做错了什么?


浮云间
浏览 114回答 1
1回答

暮色呼如

Attributes使用types.JSONText定义 使用 定义 使用json.RawMessage定义[]byte。这意味着包括 在内的所有 4 种类型的底层类型都是,这反过来意味着所有 4 种类型都可以转换为。[]byte []byte[]byte因此,这样做就足够了:func (a *Attributes) MarshalGQL(w io.Writer) {    w.Write([]byte(*a))}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go