首頁  >  文章  >  後端開發  >  無法從透過 YAML 取得的映射中提取鍵/值對

無法從透過 YAML 取得的映射中提取鍵/值對

王林
王林轉載
2024-02-08 23:40:29328瀏覽

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

php小編小新使用YAML取得映射時,時常會遇到一個問題,即無法從透過YAML取得的映射中提取鍵/值對。這個問題在實際開發中是非常常見的,它可能會導致無法正確讀取設定檔或無法取得正確的資料。在本文中,我們將深入探討這個問題的原因,並提供一些解決方案,幫助開發者在使用YAML時更順利地提取鍵/值對。

問題內容

我使用 goldmark-meta 套件來讀取 yaml 檔案。 我感興趣的內容是這樣的 在 yaml 中:

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

我想存取鍵和值 返回的介面,我被卡住了。 迭代返回給了我一個 鍵/值對的列表,但我沒有 當我不知道時知道如何獲取任何信息 提前知道按鍵名稱。 程式列印出以下內容:

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]

如何取得鍵和值字串?

解決方法

在您的 yaml 資料中,您有一個鍵 (burger),其值是映射列表(每個映射都有一個鍵)。我們可以像這樣迭代 burger 中的專案:

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

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

對於每個 item,我們可以迭代可用的鍵和值:

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

我們可以使用 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)
  }
}

來自 goldmark-meta 的範例程式碼開始,我把這個範例放在一起:

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

哪些輸出:

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

以上是無法從透過 YAML 取得的映射中提取鍵/值對的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除