Тип для работы с JSON произвольной структуры
type AnyModel json.RawMessage
Посмотрите тесты, чтобы лучше понять как это работает
Например, есть json вида:
{
"first_name":"Ivan",
"last_name":"Ivanov",
"city":{
"id":19,
"title":"Moscow"
},
"friends":[ {"id":1,"name":"Jon","verify":true},{"id":2,"name":"Bob","verify":false},{"id":3,"name":"Alexandra"} ]
}
и мы хотим узнать из него
- значение ключа
first_name
- название города
- проверить есть ли ключ
age
- получить
name
первого иid
последнего друга - вывести имена всех друзей у кого есть ключ
verify
и его значениеtrue
или этого ключа нет
any := VkApi.AnyModel(`{
"first_name":"Ivan",
"last_name":"Ivanov",
"city":{
"id":19,
"title":"Moscow"
},
"friends":[ {"id":1,"name":"Jon","verify":true},{"id":2,"name":"Bob","verify":false},{"id":3,"name":"Alexandra"} ]
}`)
firstName := any.QStringDef("first_name", "")
cityName := any.QStringDef("city.title", "")
вторым аргументом мы передали значение по умолчанию, можно использовать такой подход
firstName := any.QString("first_name")
так мы получим указатель на строку или nil если такого ключа нет
hasAge := any.QString("age") != nil
firstFriendName := any.QStringDef("friends.0.name", "")
lastFriendId := any.QIntDef("friends.-1.id", -1)
friends := any.QSlice("friends") // Указатель на массив *AnyModel
buff := ""
if friends != nil {
for _, friend := range *friends {
v := friend.QBool("verify")
if v == nil || *v == true { // если v == nil то такого ключа небыло
println(friend.QStringDef("name", ""))
}
}
}