Bạn thực sự chỉ cần một cấu trúc duy nhất và như được đề cập trong phần nhận xét, chú thích chính xác trên trường sẽ mang lại kết quả mong muốn. JSON không phải là định dạng dữ liệu cực kỳ biến thể, nó được định nghĩa rõ ràng và bất kỳ phần tử json nào, cho dù bạn có phức tạp và khó hiểu đến mức nào, bạn có thể biểu diễn khá dễ dàng và với độ chính xác 100% cả lược đồ và đối tượng trong Go và hầu hết các ngôn ngữ lập trình OO khác. Đây là một ví dụ;
package main
import (
"fmt"
"encoding/json"
)
type Data struct {
Votes *Votes `json:"votes"`
Count string `json:"count,omitempty"`
}
type Votes struct {
OptionA string `json:"option_A"`
}
func main() {
s := `{ "votes": { "option_A": "3" } }`
data := &Data{
Votes: &Votes{},
}
err := json.Unmarshal([]byte(s), data)
fmt.Println(err)
fmt.Println(data.Votes)
s2, _ := json.Marshal(data)
fmt.Println(string(s2))
data.Count = "2"
s3, _ := json.Marshal(data)
fmt.Println(string(s3))
}
https://play.golang.org/p/ScuxESTW5i
Dựa trên nhận xét gần đây nhất của bạn, bạn có thể giải quyết điều đó bằng cách sử dụng một interface{}
để đại diện cho dữ liệu bên cạnh số lượng, làm cho đếm một chuỗi và có phần còn lại của blob xô đẩy vào interface{}
mà sẽ chấp nhận về cơ bản bất cứ điều gì. Điều đó đang được nói, Go là một ngôn ngữ gõ tĩnh với một hệ thống kiểu khá nghiêm ngặt và để nhắc lại, ý kiến của bạn nói rằng 'nó có thể là bất cứ điều gì' là không đúng sự thật. JSON không thể là gì cả. Đối với bất kỳ mẩu JSON nào có lược đồ và một lược đồ có thể xác định nhiều biến thể của JSON. Tôi khuyên bạn nên dành thời gian để hiểu cấu trúc dữ liệu của bạn thay vì hacking một cái gì đó với nhau theo ý niệm rằng nó không thể được xác định khi nó hoàn toàn có thể và có lẽ khá dễ dàng cho một người biết những gì họ đang làm.
Trong mystruct, chú thích số lượng biến để được bỏ qua nếu không có mặt. Thêm cái này vào trước biến của bạn 'json:", omitempty "' – Aus
Tôi không có định nghĩa về MyStruct vì nó có thể hoàn toàn bất cứ điều gì. Tôi chỉ cần bao gồm phím đếm đó cho bất kỳ json nào mà chuỗi đại diện. Nhưng cảm ơn cho bình luận. –