是否有一种方便的方法将类似JSON的map [string] interface {}转换为struct,反之亦然,使用Go中的标签?

时间:2015-12-19 16:19:44

标签: json go marshalling unmarshalling

假设我有一个Go结构,带有JSON标记:

type Person struct {
    Name    string   `json:"name"`
    Age     int      `json:"age,omitifempty"`
    Flags   []string `json:"-"`
}

p := Person{ Name: "Bob", Age: 36, Flags: []string{"employed","father"} }

现在我想将其转换为通用map[string]interface{},例如我可能通过JSON从REST API接收:

p2 := map[string]interface{}{
    "name": "Bob",
    "age": 36,
}

我已经设计了以下函数来使用json包完成此操作。但是JSON字符串的中间步骤似乎是不必要和浪费的。

func ConvertJSONObject(input, output interface{}) error {
    encoded, err := json.Marshal(input)
    if err != nil {
        return err
    }
    return json.Unmarshal(encoded, output)
}

现在我可以这样做:

var p2 map[string]interface{}
ConvertJSONObject(p, &p2)

作为额外的奖励,相同的功能反过来,将map[string]interface{}转换为填充的结构:

var p Person
ConvertJSONObject(p2, &p)

是否有一个更简单的解决方案,它以与json包大致相同的方式来表达标签?

0 个答案:

没有答案