Ответ 1
Вам действительно нужна только одна структура, и, как упоминалось в комментариях, правильные аннотации в поле дают желаемые результаты. JSON - это не какой-то чрезвычайно разносторонний формат данных, он четко определен и любой фрагмент json, какой бы сложной и запутанной он ни был, может быть представлен довольно легко и со 100% точностью как схемой, так и объектами в Go и большинство других языков программирования OO. Вот пример;
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
Основываясь на вашем последнем комментарии, вы можете обратиться к этому, используя interface{}
для представления данных, кроме числа, что делает подсчет строки и остальную часть blob запихивает в interface{}
который будет принимать практически что угодно. Говоря это, Go - это статически типизированный язык с довольно строгой системой типов и повторять, ваши комментарии, в которых говорится, что "это может быть что угодно", неверны. JSON не может быть ничем. Для любой части JSON существует схема, и одна схема может определять множество вариантов JSON. Я советую вам потратить время, чтобы понять структуру ваших данных, а не взломать что-то вместе под понятием, что его невозможно определить, когда это абсолютно возможно, и, вероятно, довольно легко для тех, кто знает, что они делают.