2013-04-14 38 views
5

我有以下幾種類型:MarshalJSON與非標準場結構的數組在Go

type IPFilePair struct { 
    IP net.IP 
    FileName string 
} 

type IPFilePairs []*IPFilePair 

我想這名帥使用json.Marshal(sample_ipfilepairs)的JSON但由於IP不是字符串,它改變它變成了奇怪的東西。

將此輸出的JSON作爲字符串的正確方法是什麼IP

回答

9

我認爲,如果你有機會獲得的IPFilePair定義,創建你添加MarshanJSON()net.IP當地的typedef是要走的路:

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數據結構,則需要使用net.ParseIPnetIP上實現UnmarshalJSON()

我真的好奇,如果有人知道一個更簡單的方法來完成這一點。

+0

甜,那是做的工作。 – Aaronneyer

+0

很遺憾,你不能直接將'MarshalJSON'方法直接添加到'net.IP'中,但我想這是能夠獨立於完整程序編譯模塊所需的限制之一。 –

+0

@JamesHenstridge。同意。這是我知道如何去做的最好方法,但我希望有人能比Go更流暢地展示一個更簡單的解決方案。 –