Complex Deeply Nested JSON to Go Structs

Convert deeply nested JSON structures with multiple levels of nesting into well-organized Go struct hierarchies. Strategies for managing complexity.

Edge Cases

Detailed Explanation

Converting Deeply Nested JSON to Go

When JSON has four or more levels of nesting, the resulting Go code can become hard to read. Good naming and organization strategies help maintain clarity.

Example: Cloud API Response

{
  "response": {
    "cluster": {
      "name": "prod-us-1",
      "nodes": [
        {
          "id": "node-a",
          "status": "running",
          "resources": {
            "cpu": { "used": 75.5, "total": 100 },
            "memory": { "used": 8192, "total": 16384 }
          }
        }
      ]
    }
  }
}

Generated Struct Hierarchy

type APIResponse struct {
    Response Response `json:"response"`
}

type Response struct {
    Cluster Cluster `json:"cluster"`
}

type Cluster struct {
    Name  string `json:"name"`
    Nodes []Node `json:"nodes"`
}

type Node struct {
    ID        string    `json:"id"`
    Status    string    `json:"status"`
    Resources Resources `json:"resources"`
}

type Resources struct {
    CPU    ResourceUsage `json:"cpu"`
    Memory ResourceUsage `json:"memory"`
}

type ResourceUsage struct {
    Used  float64 `json:"used"`
    Total float64 `json:"total"`  // changed from int to float64 for consistency
}

Strategies for Managing Deep Nesting

  1. Flatten where possible — If you only need one leaf value, consider a helper function:
func (r *APIResponse) CPUUsage() float64 {
    if len(r.Response.Cluster.Nodes) == 0 {
        return 0
    }
    return r.Response.Cluster.Nodes[0].Resources.CPU.Used
}
  1. Reuse common typesResourceUsage is used for both CPU and memory because they share the same shape.

  2. Separate file per type — For very large API responses, define each struct in its own file within a models package.

  3. Use intermediate variables — When accessing deeply nested fields, assign intermediate structs to local variables for readability:

node := response.Response.Cluster.Nodes[0]
cpuPercent := node.Resources.CPU.Used / node.Resources.CPU.Total * 100

Handling Optional Deep Levels

Use pointers for nested objects that may be absent:

type Node struct {
    Resources *Resources `json:"resources,omitempty"`
}

This prevents nil pointer panics when a node has no resource data.

Use Case

Cloud platform APIs (AWS, GCP, Kubernetes) return deeply nested JSON describing infrastructure state. Converting these to Go structs lets you build monitoring tools and infrastructure-as-code systems.

Try It — JSON to Go Struct Converter

Open full tool