可以使用 json.RawMessage 和递归函数来处理多层不确定的 JSON 数据。

假设我们有以下 JSON 数据:

{
  "name": "John Smith",
  "age": 35,
  "address": {
    "street": "123 Main St",
    "city": "Anytown",
    "state": "CA",
    "zip": "12345"
  },
  "phoneNumbers": [
    {
      "type": "home",
      "number": "555-555-1234"
    },
    {
      "type": "work",
      "number": "555-555-5678"
    }
  ]
}

我们可以使用以下代码来获取其中的数据:

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    data := []byte(`
        {
          "name": "John Smith",
          "age": 35,
          "address": {
            "street": "123 Main St",
            "city": "Anytown",
            "state": "CA",
            "zip": "12345"
          },
          "phoneNumbers": [
            {
              "type": "home",
              "number": "555-555-1234"
            },
            {
              "type": "work",
              "number": "555-555-5678"
            }
          ]
        }
    `)

    var m map[string]json.RawMessage
    err := json.Unmarshal(data, &m)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }

    // Get name
    var name string
    err = json.Unmarshal(m["name"], &name)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    fmt.Println("Name:", name)

    // Get age
    var age int
    err = json.Unmarshal(m["age"], &age)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    fmt.Println("Age:", age)

    // Get address
    var address map[string]json.RawMessage
    err = json.Unmarshal(m["address"], &address)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    var street string
    err = json.Unmarshal(address["street"], &street)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    fmt.Println("Street:", street)
    // Get city
    var city string
    err = json.Unmarshal(address["city"], &city)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    fmt.Println("City:", city)

    // Get state
    var state string
    err = json.Unmarshal(address["state"], &state)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    fmt.Println("State:", state)

    // Get zip
    var zip string
    err = json.Unmarshal(address["zip"], &zip)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    fmt.Println("Zip:", zip)

    // Get phone numbers
    var phoneNumbers []map[string]json.RawMessage
    err = json.Unmarshal(m["phoneNumbers"], &phoneNumbers)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    for i, phoneNumber := range phoneNumbers {
        fmt.Printf("Phone number %d:\n", i+1)
        var number string
        err = json.Unmarshal(phoneNumber["number"], &number)
        if err != nil {
            fmt.Println("Error:", err)
            return
        }
        fmt.Println("Number:", number)
        var phoneType string
        err = json.Unmarshal(phoneNumber["type"], &phoneType)
        if err != nil {
            fmt.Println("Error:", err)
            return
        }
        fmt.Println("Type:", phoneType)
    }
}

输出:

Name: John Smith
Age: 35
Street: 123 Main St
City: Anytown
State: CA
Zip: 12345
Phone number 1:
Number: 555-555-1234
Type: home
Phone number 2:
Number: 555-555-5678
Type: work
golang 多层不确定的json 如何用json.RawMessage 获取里面的数据

原文地址: https://www.cveoy.top/t/topic/uLI 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录