2014-07-09 19 views
48

Tôi đã cố chuyển đổi bản đồ Go thành chuỗi json với số encoding/json Nguyên soái, nhưng kết quả là chuỗi rỗng.Chuyển đổi Bản đồ đi tới json

Dưới đây là mã của tôi:

package main 

import (
    "encoding/json" 
    "fmt" 
) 

type Foo struct { 
    Number int `json:"number"` 
    Title string `json:"title"` 
} 

func main() { 
    datas := make(map[int]Foo) 

    for i := 0; i < 10; i++ { 
     datas[i] = Foo{Number: 1, Title: "test"} 
    } 

    jsonString, _ := json.Marshal(datas) 

    fmt.Println(datas) 
    fmt.Println(jsonString) 
} 

đầu ra của tôi là:

map[9:{1 test} 2:{1 test} 7:{1 test} 3:{1 test} 4:{1 test} 5:{1 test} 6:{1 test} 8:{1 test} 0:{1 test} 1:{1 test}] 

[] 

Tôi thực sự không biết nơi tôi sai. Cảm ơn sự giúp đỡ của bạn.

+12

Xin đừng downvote không GIVI ng một bình luận. Tôi nghĩ câu hỏi là một câu hỏi hay (+1): nó chứa tất cả các mã, nó chứa một câu hỏi chính xác, đầu ra, ... Nó hoàn toàn về chủ đề và OP đã nỗ lực rất nhiều để đặt một câu hỏi hay. Nó thực sự là một sự xấu hổ để có những downvotes ở đây! – topskip

+3

Vấn đề xuất phát từ thực tế là OP rõ ràng bỏ qua lỗi đã trả lời câu hỏi một cách rõ ràng. – JimB

+2

Tôi rõ ràng tận tâm tôi đã sai. Hai lỗi trong một câu hỏi. Bạn có thể chắc chắn rằng tôi sẽ không lặp lại chúng. – Cronos87

Trả lời

53

Nếu bạn đã bắt được lỗi, bạn sẽ thấy điều này:

jsonString, err := json.Marshal(datas) 
fmt.Println(err) 

// [] json: unsupported type: map[int]main.Foo 

Vấn đề là bạn không thể sử dụng số nguyên như là chìa khóa trong JSON; nó bị cấm. Thay vào đó, bạn có thể chuyển đổi các giá trị này thành chuỗi trước, ví dụ: sử dụng strconv.Itoa.

Xem bài này để biết thêm chi tiết: https://stackoverflow.com/a/24284721/2679935

+2

Ở đây bạn có thể thấy các loại bản đồ như thế nào: http://golang.org/pkg/encoding/json/#Unmarshal Bạn có thể sử dụng một slice thay vào đó, nó sẽ ánh xạ tới một mảng JSON. Ngoài ra: luôn kiểm tra lỗi;) – seong

+0

Tôi đoán hành vi đã thay đổi. Xem https://golang.org/pkg/encoding/json/#Unmarshal cho "Loại khóa của bản đồ phải là một chuỗi, một loại số nguyên hoặc triển khai mã hóa.TextMarshaler." –

+0

@AshharHasan Rõ ràng nó đã thay đổi trong Go 1.7 (https://golang.org/doc/go1.7#encoding_json), nhưng nó vẫn không làm những gì bạn mong đợi: https://play.golang.org/p/ 0aFaQ_ByOk – julienc

20

Nó thực sự cho bạn biết những gì là sai, nhưng bạn bỏ qua nó bởi vì bạn đã không kiểm tra lỗi trở về từ json.Marshal.

json: unsupported type: map[int]main.Foo

JSON spec không hỗ trợ bất cứ điều gì ngoại trừ dây cho các phím đối tượng, trong khi javascript sẽ không kén chọn về nó, nó vẫn còn bất hợp pháp.

Bạn có hai lựa chọn:

1 Sử dụng map[string]Foo và chuyển đổi các chỉ số để chuỗi (sử dụng fmt.Sprint ví dụ):

datas := make(map[string]Foo, N) 

for i := 0; i < 10; i++ { 
    datas[fmt.Sprint(i)] = Foo{Number: 1, Title: "test"} 
} 
j, err := json.Marshal(datas) 
fmt.Println(string(j), err) 

2 Đơn giản chỉ cần sử dụng một miếng (mảng javascript):

datas2 := make([]Foo, N) 
for i := 0; i < 10; i++ { 
    datas2[i] = Foo{Number: 1, Title: "test"} 
} 
j, err = json.Marshal(datas2) 
fmt.Println(string(j), err) 

playground

+3

Bạn nói đúng. Đó là một lỗi đáng hổ thẹn ... Tôi không thực sự biết tại sao tôi sử dụng một int cho một khóa json ... Cảm ơn bạn đã ví dụ của bạn. – Cronos87

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