关于Go中非标准字段的结构数组的MarshalJSON

时间:2013-04-14 06:52:16

标签: go

我有以下类型:

type IPFilePair struct {
    IP net.IP
    FileName string
}

type IPFilePairs []*IPFilePair

我正在尝试使用json.Marshal(sample_ipfilepairs)封送此JSON,但由于IP不是字符串,因此将其更改为奇怪的内容。

将此输出IP的JSON作为字符串的正确方法是什么?

1 个答案:

答案 0 :(得分:9)

我认为如果您可以访问IPFilePair的定义,那么创建添加net.IP的{​​{1}}的本地typedef就可以了:

MarshanJSON()

输出:

package main

import (
    "encoding/json"
    "net"
    "fmt"
)

type netIP net.IP

type IPFilePair struct {
    IP netIP
    FileName string
}

type IPFilePairs []*IPFilePair

func (ip netIP) MarshalJSON() ([]byte, error) {
    return json.Marshal(net.IP(ip).String())
}

func main() {
    pair1 := IPFilePair{netIP{127, 0, 0, 1}, "file1"}
    pair2 := IPFilePair{netIP{127, 0, 0, 2}, "file2"}
    sample_ipfilepairs := IPFilePairs{&pair1, &pair2}

    b, _ := json.Marshal(sample_ipfilepairs)
    fmt.Println(string(b))
}

当然,如果您需要将其解组回到相同的Go数据结构中,您需要使用[{"IP":"127.0.0.1","FileName":"file1"},{"IP":"127.0.0.2","FileName":"file2"}] UnmarshalJSON()上实施netIP

如果有人知道更容易实现这一目标,我当然很好奇。