#go
#Вперед
Вопрос:
Допустим, у меня есть следующий json
{
"unknown": {
"knownArray": [
{"property": "somevalue", "otherproperty": false}
],
"otherKnownArray": [""]
}
}
И у меня есть следующие структуры для представления этих данных
type Model struct {
ObjectName string
KnownArray []KnownType `json:"knownArray"`
OtherKnownArray []string `json:"otherKnownArray"`
}
type KnownType struct {
Property string `json:"property1"`
Otherproperty bool `json:"otherproperty"`
}
выполнение
var model Model
json.Unmarshal(content, amp;model)
К сожалению, не десериализует ни один из json.
Как мне правильно выполнить десериализацию в моей модели?
Как мне десериализовать json, чтобы имя_объекта = «неизвестно»?
Я не совсем понимаю внутренности encoding / json, когда дело доходит до анонимных полей json.
Я также пробовал обернуть модель в третью «внешнюю» модель, но все еще не работает с анонимным полем json.
Комментарии:
1. Используйте
map[string]*Model
, затем проведите по карте и используйте ключ, чтобы задать имя объекта.
Ответ №1:
для кодирования можно использовать модель map[string]. https://play.golang.org/p/QWXQZFjBgRB
package main
import (
"fmt"
"encoding/json"
)
type Model struct {
ObjectName string
KnownArray []KnownType `json:"knownArray"`
OtherKnownArray []string `json:"otherKnownArray"`
}
type KnownType struct {
Property string `json:"property"`
Otherproperty bool `json:"otherproperty"`
}
func main() {
jsonstring := `{
"unknown": {
"knownArray": [
{"property": "somevalue", "otherproperty": false}
],
"otherKnownArray": [""]
}
}`
a := make(map[string]Model)
json.Unmarshal([]byte(jsonstring), amp;a)
var m Model
for k, v := range(a) {
m = v
m.ObjectName = k
break
}
fmt.Println(m.ObjectName, m.KnownArray, m.OtherKnownArray)
}
Комментарии:
1. Это отвечает на половину вопроса, и это потрясающе! теперь я продвинулся на 100%. Но как насчет свойства «objectName»? или мне просто назначить его постфактум?
2. @VisualBean, я обновил ответ. Да, вы просто назначаете его