Tôi nghĩ rằng nếu bạn có quyền truy cập vào định nghĩa của IPFilePair
, tạo typedef địa phương của net.IP
mà bạn thêm MarshanJSON()
đến là con đường để đi:
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))
}
đầu ra này:
[{"IP":"127.0.0.1","FileName":"file1"},{"IP":"127.0.0.2","FileName":"file2"}]
Trong số tất nhiên, nếu bạn cần phải sắp xếp lại cấu trúc dữ liệu Go giống nhau, bạn sẽ muốn triển khai UnmarshalJSON()
trên netIP
bằng cách sử dụng net.ParseIP
.
Tôi chắc chắn tò mò nếu có ai biết cách dễ dàng hơn để thực hiện việc này.
Nguồn
2013-04-14 09:29:35
Ngọt ngào, điều đó đã xảy ra. – Aaronneyer
Thật đáng tiếc là bạn không thể chỉ thêm phương thức 'MarshalJSON' trực tiếp vào' net.IP', nhưng tôi đoán đó là một trong những hạn chế cần thiết để có thể biên dịch các mô-đun riêng biệt với toàn bộ chương trình. –
@JamesHenstridge. Đã đồng ý. Đây là cách tốt nhất tôi biết làm thế nào để làm điều đó, nhưng tôi là loại hy vọng một người thông thạo hơn trong Go hơn tôi sẽ đi cùng và hiển thị một giải pháp đơn giản hơn. –