отменить перевод анонимного поля json в «именованное» поле

#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, я обновил ответ. Да, вы просто назначаете его