5

我有以下类型:

type IPFilePair struct {
    IP net.IP
    FileName string
}

type IPFilePairs []*IPFilePair

我正在尝试编组这个使用的 JSON,json.Marshal(sample_ipfilepairs)但因为IP它不是字符串,所以它将它变成了一些奇怪的东西。

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

4

1 回答 1

9

我认为,如果您有权访问 的定义,那么创建您添加IPFilePair的本地 typedef是要走的路:net.IPMarshanJSON()

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))
}

这输出:

[{"IP":"127.0.0.1","FileName":"file1"},{"IP":"127.0.0.2","FileName":"file2"}]

当然,如果您需要将其解组回相同的 Go 数据结构,您将需要UnmarshalJSON()netIPusing上实现net.ParseIP.

如果有人知道更简单的方法来实现这一点,我当然很好奇。

于 2013-04-14T09:29:35.173 回答