Maison  >  Article  >  développement back-end  >  Impossible d'extraire les paires clé/valeur de la carte obtenue via YAML

Impossible d'extraire les paires clé/valeur de la carte obtenue via YAML

王林
王林avant
2024-02-08 23:40:29328parcourir

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

L'éditeur php Xiaoxin rencontre souvent un problème lors de l'utilisation de YAML pour obtenir des mappages, c'est-à-dire que les paires clé/valeur ne peuvent pas être extraites du mappage obtenu via YAML. Ce problème est très courant dans le développement réel et peut empêcher la lecture correcte du fichier de configuration ou l'obtention des données correctes. Dans cet article, nous examinerons la cause de ce problème et proposerons quelques solutions pour aider les développeurs à extraire plus facilement les paires clé/valeur lors de l'utilisation de YAML.

Contenu de la question

J'utilise le package goldmark-meta pour lire les fichiers yaml. Ce qui m'intéresse c'est ça En yaml :

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

Je souhaite accéder aux clés et aux valeurs De retour à l'interface, je suis bloqué. L'itération me renvoie un une liste de paires clé/valeur, mais je n'en ai pas je sais comment obtenir des informations quand je ne sais pas Connaissez les noms clés à l’avance. Le programme imprime ce qui suit :

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]

Comment obtenir une chaîne de clé et de valeur ?

Solution de contournement

Dans vos données yaml, vous avez un élément dans une clé (burger),其值是映射列表(每个映射都有一个键)。我们可以像这样迭代 burger :

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

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

Pour chaque item, nous pouvons parcourir les clés et valeurs disponibles :

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

Nous pouvons utiliser fmt.sprintfinterface{} 中的键和值转换为 string :

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)
  }
}

En commençant avec l'exemple de code goldmark-meta de , j'ai assemblé cet exemple :

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)
        }
    }
}

Quels résultats :

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer