Создание структуры перед демаршалом в golang - PullRequest
0 голосов
/ 24 января 2020

Я новичок в golang и у меня есть вопрос.

У меня есть 5 структур, где я использую Json, но файл JSON может иметь больше структур, чем те, которые я предопределил, НО. .. структуры JSON удовлетворяют структурам в моем программировании (допустим, у меня есть 5 структур "struct1", 6 структур "struct 2", 1 struct "struct 3" и т. д.)

У меня вопрос: я хочу создать функцию, в которой я беру ФАЙЛ JSON, читаю его структуры и получаю в качестве числа выходных число файлов JSON.

I Думаю, я мог бы использовать интерфейс map [string] {}, но я не понимаю этого.

Надеюсь, я объяснил себе большое спасибо!

1 Ответ

0 голосов
/ 25 января 2020

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

Интерфейсы

Прежде всего, некоторые базовые c go знания, которые могут быть полезны, но за пределами JSON маршалинга. Тип интерфейса {} выглядит специальным, но не является аппаратным ключевым словом, как может показаться первым. Что делает ключевое слово интерфейса, так это описывает требования, которые должен иметь объект для выполнения этого интерфейса. Поскольку интерфейс {} не имеет требований, и поскольку все автоматически подключается в go, все удовлетворяет типу интерфейса {}.

Из-за этой реализации интерфейсов map [string] interface {} действительно является map [string] . Это позволяет JSON un / marshal не заботиться о том, что находится на стороне значения карты. Это точно соответствует формату JSON, где у вас есть строковый ключ на одной стороне, и значение, которое может быть любой из JSON типов данных с другой.

Сколько разных объектов находится в базовом JSON объекте?

Давайте возьмем пример json

{
  "debug": "on",
  "window": {
    "title": "Sample Konfabulator Widget",
    "name": "main_window",
    "width": 500,
    "height": 500
  },
  "image": {
    "src": "Images/Sun.png",
    "name": "sun1",
    "hOffset": 250,
    "vOffset": 250,
    "alignment": "center"
  },
  "text": {
    "data": "Click Here",
    "size": 36,
    "style": "bold",
    "name": "text1",
    "hOffset": 250,
    "vOffset": 100,
    "alignment": "center",
    "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"
  }
}

Ответ на вопрос в этом обстоятельств будет четыре. отладка, окно, изображение и текст.

Процесс определения числа будет следующим:

  1. Загрузка json в байтовый массив.
  2. Маршал в интерфейс {}
  3. Определите тип (массив против объекта и c.), Используя переключатель типа. см. this A Tour of Go page
    • Если вы знаете тип, вы можете пропустить этот шаг
  4. Преобразовать в нужный тип
  5. Получить длину или выполнить любую другую операцию по желанию.
package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    myJSON := `<see above>`

    var outStruct *interface{}
    json.Unmarshal([]byte(myJSON), &outStruct)
    outMap := (*outStruct).(map[string]interface{})
    fmt.Printf("Num Structs: %d", len(outMap))
}

Go Детская площадка

Сколько json объектов, которые У меня нет структур для присутствия?

Этот ответ имеет очень похожий ответ на первый и действительно касается манипулирования выходной картой и структурой. Перенос почти всего кода из первого в во-вторых, давайте предположим, что у вас настроены следующие структуры


type Image struct {
    Name string
    //etc
}
type Text struct {
    Name string
    //etc
}
type Window struct {
    Name string
    //etc
}

type Base struct {
    Image  Image
    Window Window
    Text   Text
}

. В этом случае, в дополнение к предыдущим шагам, вам потребуется 5. Маршал json в базовый объект 6. Go через интерфейс map [string] {} и для каждого ключа 7. Определите, является ли ключ одним из объектов в вашей базовой структуре

total := 0
for k, _ := range outMap {
    if k != "image" && k != "text" && k != "window" && k != "other" {
        total++
    }
}
fmt.Printf("Total unknown structs: %d\n", total)

Сколько моих структур пусто?

Этот последний вопрос также довольно прост и может быть сделан путем проверки карта для значения, заданного ключом ввода, но для завершения, пример кода маршалирует JSON в структуру и использует это.

Маршал JSON в базу Для каждого из Окна, Предмета, Текста, Другое в базе, определите, пусто ли.
total = 0

if (Image{}) == outBase.Image {
    total++
}
if (Window{}) == outBase.Window {
    total++
}
if (Text{}) == outBase.Text {
    total++
}
if (Other{}) == outBase.Other {
    total++
}

fmt.Printf("Total empty structs: %d\n", total)

Go Детская площадка

См. это go сообщение в блоге для получения дополнительной информации о golang JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...