У меня есть ответ 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, чтобы получить вложенную карту, но я не уверен, что это правильный способ.
Любая помощь/руководство будет принята с благодарностью!
Чтобы быть еще более ясным, добро пожаловать в SO! Что именно вы пробовали до сих пор? Мы здесь гораздо больше, чтобы помочь с конкретными вопросами типа «Я попробовал X, но он не дал того, что я ожидал, и вместо этого привел к ошибке!» сопровождается Минимальным, полным и проверяемым примером (в теле вашего сообщения, без ссылки на сторонний сайт, хотя, конечно, это может быть идеальным дополнением)
@coxley обновлено выше! Однако я еще не закончил кодирование демаршалинговой и маршалинговой части.
Используемой вами библиотеке yaml не нравится строка yaml. Если я добавляю дефисы, он анализирует нормально (хотя и не заполняет ваш struct, вероятно, из-за обертки project: go.dev/play/p/FJscGHHp7bd. Я недостаточно хорошо знаю yaml, чтобы знать, Ввод, который вы используете, действителен или нет, но для меня это не пахнет проблемой с вашим кодом.

Этого можно добиться, изменив существующий код — здесь есть две проблемы:
[]MyStruct, но project только один. Файлы и папки — единственные фрагменты, которые вам нужны.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
Спасибо! Все еще пытаюсь разобраться в Го…
Можете ли вы показать код того, что вы пробовали?