Heim  >  Artikel  >  Backend-Entwicklung  >  Schlüssel/Wert-Paare können nicht aus der über YAML erhaltenen Karte extrahiert werden

Schlüssel/Wert-Paare können nicht aus der über YAML erhaltenen Karte extrahiert werden

王林
王林nach vorne
2024-02-08 23:40:29328Durchsuche

无法从通过 YAML 获取的映射中提取键/值对

Der PHP-Editor Xiaoxin stößt häufig auf ein Problem, wenn er YAML zum Abrufen von Zuordnungen verwendet. Das heißt, die Schlüssel/Wert-Paare können nicht aus der über YAML erhaltenen Zuordnung extrahiert werden. Dieses Problem tritt in der tatsächlichen Entwicklung sehr häufig auf und kann dazu führen, dass die Konfigurationsdatei nicht richtig gelesen werden kann oder die richtigen Daten nicht abgerufen werden können. In diesem Artikel werden wir uns mit der Ursache dieses Problems befassen und einige Lösungen bereitstellen, die Entwicklern dabei helfen, Schlüssel/Wert-Paare bei der Verwendung von YAML reibungsloser zu extrahieren.

Frageninhalt

Ich verwende das Goldmark-Meta-Paket, um Yaml-Dateien zu lesen. Was mich interessiert, ist Folgendes In Yaml:

burger:
- a: ay
- b: bee
- c: see

Ich möchte auf Schlüssel und Werte zugreifen Zurück zur Benutzeroberfläche: Ich stecke fest. Die Iteration gibt mir a zurück eine Liste von Schlüssel/Wert-Paaren, aber ich habe keine Ich weiß, wie ich an Informationen komme, wenn ich es nicht weiß Kennen Sie die wichtigsten Namen im Voraus. Das Programm gibt Folgendes aus:

func (c *config) burger() string {
    // c.pagefm is type map[string]interface{}
    b, ok := c.pagefm["burger"].([]interface{})
    if !ok {
    // no burger entry  in yaml
        return ""
    }
  debug("burger list has %v items:\n%v", len(b), b)  
  debug("type: %v", reflect.typeof(b))
  for i := 0; i < len(b); i++ {
    debug("%v", b[i])
  }
 return ""
}
Burger list has 3 items:
[map[a:ay] map[b:bee] map[c:see]]
Type: []interface {}
map[a:ay]
map[b:bee]
map[c:see]

Wie erhalte ich eine Schlüssel- und Wertzeichenfolge?

Workaround

In Ihren Yaml-Daten haben Sie ein Element in einem Schlüssel (burger),其值是映射列表(每个映射都有一个键)。我们可以像这样迭代 burger:

b, ok := c.pagefm["burger"].([]interface{})
if !ok {
  return ""
}

for _, item := range burger {
  ...
}

Für jedes item können wir die verfügbaren Schlüssel und Werte durchlaufen:

for _, item := range burger {
  for k, v := range item.(map[interface{}]interface{}) {
    ...
  }
}

Wir können fmt.sprintfinterface{} 中的键和值转换为 string:

verwenden
for _, item := range burger {
  for k, v := range item.(map[interface{}]interface{}) {
    k_str := fmt.sprintf("%v", k)
    v_str := fmt.sprintf("%v", v)

    fmt.printf("key %s value %s\n", k_str, v_str)
  }
}

Ausgehend mit dem Beispielcode goldmark-meta von habe ich dieses Beispiel zusammengestellt:

package main

import (
    "bytes"
    "fmt"

    "github.com/yuin/goldmark"
    meta "github.com/yuin/goldmark-meta"
    "github.com/yuin/goldmark/parser"
)

func main() {
    markdown := goldmark.new(
        goldmark.withextensions(
            meta.meta,
        ),
    )
    source := `---
burger:
- a: ay
- b: bee
- c: see
---

# hello goldmark-meta
`

    var buf bytes.buffer
    context := parser.newcontext()
    if err := markdown.convert([]byte(source), &buf, parser.withcontext(context)); err != nil {
        panic(err)
    }
    metadata := meta.get(context)
    burger := metadata["burger"].([]interface{})
    for _, item := range burger {
        for k, v := range item.(map[interface{}]interface{}) {
            k_str := fmt.sprintf("%v", k)
            v_str := fmt.sprintf("%v", v)
            fmt.printf("key %s value %s\n", k_str, v_str)
        }
    }
}

Was ergibt:

key a value ay
key b value bee
key c value see

Das obige ist der detaillierte Inhalt vonSchlüssel/Wert-Paare können nicht aus der über YAML erhaltenen Karte extrahiert werden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen