我有一个看起来像这样的结构:
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"
,C
或0
是什么,因此常量的名称更有用。
很抱歉,是否曾经有人问过这个问题。我四处搜寻,找不到任何东西。
这里是一个例子:
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))
。
答案 0 :(得分:2)
您需要为您的类型定义一个自定义编组器。
json.Marshal
函数{{1}}定义{{1}}应该如何整理您的类型。如果您还需要走另一个方向,也可以进行类似的编组操作。
答案 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))
}