Как проанализировать строку содержимого файла yaml в Go?

У меня есть ответ json, из которого мне нужно извлечь список значений для файлов и папок, однако количество элементов в каждом списке и свойства в ответе json не фиксированы, как показано ниже:

JSON-ответ:

"config.yml" : "project: \n  files: \n    - file1\n    - file2\n  folders: \n    - folder1\n    - folder2\n  random1: \n  random2:\n    - redundant1"

Как мне проанализировать строку и извлечь список файлов и папок в строку []?

Для справки: config.yml

project: 
  files: 
    - file1
    - file2
  folders: 
    - folder1
    - folder2
  random1: 
  random2:
    - redundant1

Я попробовал просто yaml.unmarshalling строки (https://go.dev/play/p/j0RvgHo3djI), но это не сработало.

Я перехожу к попытке yaml.unmarshalling строки, затем json.marshal и json.unmarshal, чтобы получить вложенную карту, но я не уверен, что это правильный способ.

Любая помощь/руководство будет принята с благодарностью!

Можете ли вы показать код того, что вы пробовали?

coxley 26.02.2024 16:16

Чтобы быть еще более ясным, добро пожаловать в SO! Что именно вы пробовали до сих пор? Мы здесь гораздо больше, чтобы помочь с конкретными вопросами типа «Я попробовал X, но он не дал того, что я ожидал, и вместо этого привел к ошибке!» сопровождается Минимальным, полным и проверяемым примером (в теле вашего сообщения, без ссылки на сторонний сайт, хотя, конечно, это может быть идеальным дополнением)

ti7 26.02.2024 16:24

@coxley обновлено выше! Однако я еще не закончил кодирование демаршалинговой и маршалинговой части.

NormalNorman 26.02.2024 16:24

Используемой вами библиотеке yaml не нравится строка yaml. Если я добавляю дефисы, он анализирует нормально (хотя и не заполняет ваш struct, вероятно, из-за обертки project: go.dev/play/p/FJscGHHp7bd. Я недостаточно хорошо знаю yaml, чтобы знать, Ввод, который вы используете, действителен или нет, но для меня это не пахнет проблемой с вашим кодом.

Stephen Newell 26.02.2024 16:39
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
4
89
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Этого можно добиться, изменив существующий код — здесь есть две проблемы:

  1. Это демаршалинг в []MyStruct, но project только один. Файлы и папки — единственные фрагменты, которые вам нужны.
  2. Это вообще не учитывается project. В настоящее время декодер ожидает, что files и folders будут находиться на верхнем уровне документа YAML.

Вот исправленная версия:

package main

import (
    "fmt"

    "github.com/goccy/go-yaml"
)

func main() {
    yml := "project: \n  files: \n    - file1\n    - file2\n  folders: \n    - folder1\n    - folder2\n  random1: \n  random2:\n    - redundant1"
    var resp MyStruct
    if err := yaml.Unmarshal([]byte(yml), &resp); err != nil {
        panic(fmt.Errorf("could not parse yaml from file. %w", err))
    }

    fmt.Println(&resp)
}

type MyStruct struct {
    Project struct {
        Files   []string `yaml:"files"`
        Folders []string `yaml:"folders"`
    } `yaml:"project"`
}

Играть: https://go.dev/play/p/r8Q0kSx3NVc

Спасибо! Все еще пытаюсь разобраться в Го…

NormalNorman 26.02.2024 17:06

Другие вопросы по теме