Go анализ JSON с 2-мя вложенными типами - PullRequest
0 голосов
/ 03 марта 2020

У меня есть 2 объекта, например:

type appA struct {
  appType string
  frontend string
}

type appB struct {
  appType string
  backend string
}

У меня есть файл конфигурации в формате JSON, например:

[
  {
    "appType" : "A",
    "frontend": "URL"
  },
  {
    "appType": "B",
    "backend": "SQL"
  }
]

Согласно this отличная идея - я создал еще одну структуру:

type genericApp struct {
  appType string
}

Так что теперь я могу красиво разархивировать JSON и узнать, какой объект в JSON является каким типом приложения. Теперь моя большая проблема заключается в том, как снова «маршалировать и отменять маршалинг» - могу ли я как-то ссылаться на уже распакованные объекты как интерфейс и повторно демаршировать их как разные объекты?

Единственное другое решение, которое у меня есть, - это чтение файла. N раз, каждый для каждого типа структуры, а затем l oop через массив genericApp и «собрать» соответствующий объект из соответствующего массива, но это звучит как ужасная практика ...

РЕДАКТИРОВАТЬ Я ответил на вопрос, используя нотацию json:...omitempty, но у меня все еще есть проблема - что, если два отдельных объекта имеют одинаковое имя поля с разными типами? Например, appType может быть строкой или числом?

Ответы [ 2 ]

2 голосов
/ 03 марта 2020

создать конфигурацию. json подать файл, который json внутри, а затем попробовать id:

type MyAppModel struct {
    AppType  string `json:"appType"`
    Frontend string `json:"frontend,omitempty"`
    Backend  string `json:"backend,omitempty"`
}

func(m *MyAppModel) GetJson()string{
    bytes,_:=json.Marshal(m)
    return string(bytes)
}

func (m MyAppModel) GetListJson(input []MyAppModel) string {
    bytes,_:=json.Marshal(input)
    return string(bytes)
}

func(m MyAppModel) ParseJson(inputJson string)[]MyAppModel{
    model:=[]MyAppModel{}
    err:=json.Unmarshal([]byte(inputJson),&model)
    if err!=nil{
        println(err.Error())
        return nil
    }
    return model
}

func inSomeMethodLikemain(){
    //reading from file
    bytes,err:=ioutil.ReadFile("config.json")
    if err!=nil{
        panic(err)
    }
    configs := MyAppModel{}.ParseJson(string(bytes))
    if configs==nil || len(configs)==0{
        panic(errors.New("no config data in config.json"))
    }
    println(configs[0].AppType)

    //writing to file

    jsonOfList:=MyAppModel{}.GetListJson(configs)
    err=ioutil.WriteFile("config.json",[]byte(jsonOfList),os.ModePerm))
    if err!=nil{
        panic(err.Error())
    }

}
0 голосов
/ 03 марта 2020

Выяснилось, что вы можете использовать некоторый синтаксис go для создания большой структуры:

type genericApp struct {
  appType string
  frontend string `json:"frontend, omitempty"`
  backend string `json:"backend, omitempty"`
}

Однако у этого есть некоторые проблемы:

  1. Это собирается создать огромная структура, если у вас много типов (если бы у меня было 20 типов приложений вместо 2, это было бы длиной в 100 строк)
  2. Это не дает вам двух отдельных структур - вам все еще нужно реализовать это разделение позже ( распределительный шкаф или тип литья et c.)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...