Home >Backend Development >Golang >How to Unmarshal Nested JSON with Unknown Keys?

How to Unmarshal Nested JSON with Unknown Keys?

Susan Sarandon
Susan SarandonOriginal
2024-11-18 12:29:02771browse

How to Unmarshal Nested JSON with Unknown Keys?

Unraveling Nested JSON with Unknown Keys

Unraveling JSON Complexity

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.

Structuring the Solution

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.

Unveiling the JSON Secrets

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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn