Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Unmarshal Nested JSON dengan Kunci Tidak Diketahui?

Bagaimana untuk Unmarshal Nested JSON dengan Kunci Tidak Diketahui?

Susan Sarandon
Susan Sarandonasal
2024-11-18 12:29:02635semak imbas

How to Unmarshal Nested JSON with Unknown Keys?

Merungkai JSON Bersarang dengan Kekunci Tidak Diketahui

Merungkai Kerumitan JSON

Menemui data JSON dengan kunci yang tidak diketahui dan struktur bersarang yang rumit boleh menjadi tugas yang sukar. Pertimbangkan format JSON berikut:

{
  "message": {
    "Server1.example.com": [
      {
        "application": "Apache",
        "host": {
          "name": "/^Server-[13456]/"
        },
        "owner": "User1",
        "project": "Web",
        "subowner": "User2"
      }
    ],
    "Server2.example.com": [
      {
        "application": "Mysql",
        "host": {
          "name": "/^Server[23456]/"
        },
        "owner": "User2",
        "project": "DB",
        "subowner": "User3"
      }
    ]
  },
  "response_ms": 659,
  "success": true
}

Seperti yang digambarkan dalam contoh ini, nama pelayan (Pelayan[0-9].example.com) tidak ditentukan dan boleh berbeza-beza. Selain itu, medan berikut nama pelayan tidak mempunyai kunci yang jelas.

Menstrukturkan Penyelesaian

Untuk menangkap data ini dengan berkesan, kami boleh menggunakan struktur peta[rentetan]ServerStruct:

type YourStruct struct {
    Success bool
    ResponseMS int
    Servers map[string]*ServerStruct
}

type ServerStruct struct {
    Application string
    Owner string
    [...]
}

Dengan menggabungkan struktur ini, kami mendayakan peruntukan nama pelayan yang tidak diketahui ke dalam peta.

Menyingkap Rahsia JSON

Untuk lebih cemerlang dalam menghapuskan JSON, pertimbangkan untuk menambah teg JSON yang diperlukan:

import "encoding/json"

// YourStruct contains the JSON structure with success, response time, and a map of servers
type YourStruct struct {
    Success    bool
    ResponseMS int `json:"response_ms"`
    Servers    map[string]*ServerStruct `json:"message"`
}

// ServerStruct holds server information, including application, owner, etc.
type ServerStruct struct {
    Application string `json:"application"`
    Owner       string `json:"owner"`
    [...]
}

// UnmarshalJSON is a custom unmarshaller that handles nesting and unknown keys
func (s *YourStruct) UnmarshalJSON(data []byte) error {
    type YourStructHelper struct {
        Success    bool
        ResponseMS int               `json:"response_ms"`
        Servers    map[string]ServerStruct `json:"message"`
    }
    var helper YourStructHelper
    if err := json.Unmarshal(data, &helper); err != nil {
        return err
    }
    s.Success = helper.Success
    s.ResponseMS = helper.ResponseMS
    s.Servers = make(map[string]*ServerStruct)
    for k, v := range helper.Servers {
        s.Servers[k] = &v // Explicitly allocate memory for each server
    }
    return nil
}

Dengan pelarasan ini, anda boleh mengeluarkan JSON yang disediakan dengan berkesan ke dalam struktur tersuai anda, membuka jalan untuk manipulasi data yang mudah.

Atas ialah kandungan terperinci Bagaimana untuk Unmarshal Nested JSON dengan Kunci Tidak Diketahui?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn