封送至JSON时将类型int转换为const名称的字符串

时间:2018-08-05 15:16:22

标签: go

我有一个看起来像这样的结构:

const evolve = _.curry((transformations, item) =>
    _.mapValues.convert({ cap: false })((value, key) => {
        const transformation = _.propOr(identity, key, transformations);

        return _.cond([
            [_.isFunction, t => t(value)],
            [_.isObject, t => evolve(t, value)],
            [_.T, _.always(value)],
        ])(transformation);
    }, item)
);

当我在结构体上调用type Type int const ( A Type = iota B C ) type Character struct { Type Type `json:"type"` } 时,有一种方法可以使json.Marshal(...)表示形式为名为json:"type""A"或“ {{1} }”?

当它以JSON表示时,没人会知道"B"C0是什么,因此常量的名称更有用。

很抱歉,是否曾经有人问过这个问题。我四处搜寻,找不到任何东西。

这里是一个例子:

1

我希望2打印type Type int const ( A Type = iota B C ) type Character struct { Type Type `json:"type,string"` } func main() { c := Character{} c.Type = A j, err := json.Marshal(c) if err != nil { panic(err) } fmt.Println(string(j)) } ,而不是fmt.Println(string(j))

3 个答案:

答案 0 :(得分:2)

您需要为您的类型定义一个自定义编组器。

json.Marshal

函数{{1}}定义{{1}}应该如何整理您的类型。如果您还需要走另一个方向,也可以进行类似的编组操作。

请参见https://play.golang.org/p/mLxThWA19by

答案 1 :(得分:1)

简短答复:没有直接选择可以实现您的目标。

长回答:事实是,您实际上可以覆盖Go编码结构的方式。

这是工作代码:

https://play.golang.org/p/i92pUpNG-Wr

package main

import (
    "encoding/json"
    "fmt"
)

// please consider to rename this!
type Type int

const (
    A Type = iota
    B
    C
)

type Character struct {
    Type Type `json:"-"`
}

func (c *Character) mapTypeToString() string {
    switch c.Type {
    case B:
        return "B"
    case C:
        return "C"
    }

    // defaults on A
    return "A"
}

// MarshalJSON overwrites the standard JSON marshal.
func (c *Character) MarshalJSON() ([]byte, error) {
    return json.Marshal(&struct {
        Type string `json:"type"`
    }{
        Type: c.mapTypeToString(),
    })
}

func main() {
    c := &Character{}
    c.Type = A
    j, err := json.Marshal(c)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(j))
}

请注意c := &Character{}的初始化。

需要权衡的mapTypeToString()方法需要根据... Type的不同类型进行更新。

也请考虑避免命名诸如Type的结构和变量:)

答案 2 :(得分:0)

因此您的JSON API为您提供类型A:

  

我希望fmt.Println(string(j))打印{“ type”:“ A”},而不是{“ type”:0}。

您可以这样更改代码,然后您的API起作用:

https://play.golang.org/p/ypvFvQpBw-C

type JSONType string

const (
    A JSONType = "A"
    B JSONType = "B"
    C JSONType = "C"
)

type Character struct {
    JSONType JSONType `json:"type,string"`
}

func main() {
    c := Character{}
    c.JSONType = A
    j, err := json.Marshal(c)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(j))
}