我有以下类型:
type IPFilePair struct {
IP net.IP
FileName string
}
type IPFilePairs []*IPFilePair
我正在尝试使用json.Marshal(sample_ipfilepairs)
封送此JSON,但由于IP
不是字符串,因此将其更改为奇怪的内容。
将此输出IP
的JSON作为字符串的正确方法是什么?
答案 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
。
如果有人知道更容易实现这一目标,我当然很好奇。