Encountering JSON data with unknown keys and intricate nesting structures can be a daunting task. Consider the following JSON format:
{ "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 }
As illustrated in this example, server names (Server[0-9].example.com) are not predetermined and can vary. Additionally, the field following server names lacks an explicit key.
To effectively capture this data, we can employ a map[string]ServerStruct structure:
type YourStruct struct { Success bool ResponseMS int Servers map[string]*ServerStruct } type ServerStruct struct { Application string Owner string [...] }
By incorporating these structures, we enable the allocation of unknown server names into the map.
To further excel in unmarshalling the JSON, consider adding necessary JSON tags:
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 }
With these adjustments, you can effectively unmarshal the provided JSON into your custom struct, paving the way for effortless data manipulation.
The above is the detailed content of How to Unmarshal Nested JSON with Unknown Keys?. For more information, please follow other related articles on the PHP Chinese website!