2013-04-14 38 views
5

tôi có các loại sau:MarshalJSON trên mảng của cấu trúc với lĩnh vực tiêu chuẩn phi tại Gò

type IPFilePair struct { 
    IP net.IP 
    FileName string 
} 

type IPFilePairs []*IPFilePair 

Tôi đang cố gắng để marshal JSON này sử dụng json.Marshal(sample_ipfilepairs) nhưng vì IP không phải là một chuỗi, nó thay đổi nó thành một cái gì đó kỳ lạ.

Cách thích hợp để làm cho JSON của đầu ra này là IP làm chuỗi?

Trả lời

9

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.

+0

Ngọt ngào, điều đó đã xảy ra. – Aaronneyer

+0

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. –

+0

@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. –

Các vấn đề liên quan