Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Tidak dapat mengekstrak pasangan kunci/nilai daripada peta yang diperoleh melalui YAML

Tidak dapat mengekstrak pasangan kunci/nilai daripada peta yang diperoleh melalui YAML

王林
王林ke hadapan
2024-02-08 23:40:29356semak imbas

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

editor php Xiaoxin sering menghadapi masalah apabila menggunakan YAML untuk mendapatkan pemetaan, iaitu pasangan kunci/nilai tidak boleh diekstrak daripada pemetaan yang diperoleh melalui YAML. Masalah ini sangat biasa dalam pembangunan sebenar, dan ia mungkin menyebabkan fail konfigurasi tidak dapat dibaca dengan betul atau data yang betul diperolehi. Dalam artikel ini, kami akan menyelidiki punca masalah ini dan menyediakan beberapa penyelesaian untuk membantu pembangun mengekstrak pasangan kunci/nilai dengan lebih lancar apabila menggunakan YAML.

Kandungan soalan

Saya menggunakan pakej goldmark-meta untuk membaca fail yaml. Apa yang saya minat ialah ini Dalam yaml:

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

Saya mahu mengakses kunci dan nilai Kembali ke antara muka, saya terperangkap. Lelaran mengembalikan saya a senarai pasangan kunci/nilai, tetapi saya tidak mempunyai tahu bagaimana untuk mendapatkan maklumat apabila saya tidak tahu Ketahui nama kunci lebih awal. Program ini mencetak perkara berikut:

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]

Bagaimana untuk mendapatkan rentetan kunci dan nilai?

Penyelesaian

Dalam data yaml anda, anda mempunyai item dalam kunci (burger),其值是映射列表(每个映射都有一个键)。我们可以像这样迭代 burger:

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

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

Untuk setiap item kita boleh mengulangi kekunci dan nilai yang tersedia:

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

Kita boleh guna 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)
  }
}

Bermula dengan kod contoh goldmark-meta daripada , saya kumpulkan contoh ini:

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

Apakah output:

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

Atas ialah kandungan terperinci Tidak dapat mengekstrak pasangan kunci/nilai daripada peta yang diperoleh melalui YAML. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam