ホームページ  >  記事  >  バックエンド開発  >  Go でネストされた JSON を効率的に反復するにはどうすればよいですか?

Go でネストされた JSON を効率的に反復するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-26 10:46:11585ブラウズ

How to Efficiently Iterate Through Nested JSON in Go?

Go Lang での第 2 レベルのネストされた JSON のループ/反復

以下に示すようなネストされた JSON 構造が発生するシナリオを考えてみましょう。

{
    "outterJSON": {
        "innerJSON1": {
            "value1": 10,
            "value2": 22,
            "InnerInnerArray": [ "test1" , "test2"],
            "InnerInnerJSONArray": [ {"fld1" : "val1"} , {"fld2" : "val2"} ]
        },
        "InnerJSON2":"NoneValue"
    }
}

タスクは、この構造を効果的に反復処理し、すべてのキーと値のペアを文字列として取得して、さらに処理することです。残念ながら、このような動的な JSON 入力の構造体を手動で定義することは現実的ではありません。

効率的な反復アプローチ

この課題を効率的に解決するために、再帰的アプローチが採用されています。

func parseMap(m map[string]interface{}) {
  for key, val := range m {
    // Check the type of the value
    switch concreteVal := val.(type) {
      case map[string]interface{}:
        // If it's a nested map, recursively call the function
        parseMap(val.(map[string]interface{}))
      case []interface{}:
        // If it's a nested array, call the function to parse the array
        parseArray(val.([]interface{}))
      default:
        // For all other types, print the key and value as a string
        fmt.Println(key, ":", concreteVal)
    }
  }
}

この再帰関数 parseMap は、マップ内の各値の型を調べます。値自体がマップである場合、parseMap を再帰的に呼び出して、そのネストされたマップを走査します。値が配列の場合、parseArray を呼び出して反復処理します。他のすべての型 (文字列、数値など) の場合は、キーと値を文字列として出力するだけです。

デモ

前に提供した JSON 入力の例を考えてみましょう。以下のコードを実行すると、次の出力が生成されます:

func parseArray(a []interface{}) {
  for i, val := range a {
    // Check the type of the value
    switch concreteVal := val.(type) {
      case map[string]interface{}:
        // If it's a nested map, recursively call the function
        parseMap(val.(map[string]interface{}))
      case []interface{}:
        // If it's a nested array, call the function to parse the array
        parseArray(val.([]interface{}))
      default:
        // For all other types, print the index and value as a string
        fmt.Println("Index:", i, ":", concreteVal)
    }
  }
}

const input = `
{
    "outterJSON": {
        "innerJSON1": {
            "value1": 10,
            "value2": 22,
            "InnerInnerArray": [ "test1" , "test2"],
            "InnerInnerJSONArray": [{"fld1" : "val1"} , {"fld2" : "val2"}]
        },
        "InnerJSON2":"NoneValue"
    }
}
`

出力:

//outterJSON
//innerJSON1
//InnerInnerJSONArray
//Index: 0
//fld1 : val1
//Index: 1
//fld2 : val2
//value1 : 10
//value2 : 22
//InnerInnerArray
//Index 0 : test1
//Index 1 : test2
//InnerJSON2 : NoneValue

このアプローチは、ネストされた JSON 内のすべてのキーと値のペアを効果的にキャプチャし、処理やGo lang での抽出タスク

以上がGo でネストされた JSON を効率的に反復するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。