Преобразование строки в JSON или структуру

Я хочу получить строку, которая представляет json как этот:

{"vote": {"option_A": "3"}}

и включить в него ключ "count", чтобы он заканчивался следующим образом:

{"vote": {"option_A": "3"}, "count": "1"}

Вот почему я планировал преобразовать его в json, чтобы добавить счетчик, а затем снова создать строку. Проблема в том, что я не знаю структуру этого json, поэтому я не могу использовать json.Unmarshal(in, &myStruct) потому что эта структура меняется. Как я могу это сделать? большое спасибо

Ответы

Ответ 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. Я советую вам потратить время, чтобы понять структуру ваших данных, а не взломать что-то вместе под понятием, что его невозможно определить, когда это абсолютно возможно, и, вероятно, довольно легко для тех, кто знает, что они делают.

Ответ 2

package main

import "encoding/json"

func main() {
    in := []byte('{ "votes": { "option_A": "3" } }')
    var raw map[string]interface{}
    json.Unmarshal(in, &raw)
    raw["count"] = 1
    out, _ := json.Marshal(raw)
    println(string(out))
}

https://play.golang.org/p/QUyL3cyTAC