How to Unmarshal Dynamic Viper or JSON Keys as Struct Fields in Go?

Barbara Streisand
Release: 2024-11-20 15:30:13
Original
424 people have browsed it

How to Unmarshal Dynamic Viper or JSON Keys as Struct Fields in Go?

Unmarshaling Dynamic Viper or JSON Keys as Struct Fields in Go

In Go, handling dynamic JSON keys within struct fields can be challenging. Let's delve into this and provide a comprehensive solution using the Viper library.

Problem Statement

Consider a JSON config file with dynamic keys:

{
  "things" :{
    "123abc" :{
      "key1": "anything",
      "key2" : "more"
    },
    "456xyz" :{
      "key1": "anything2",
      "key2" : "more2"
    },
    "blah" :{
      "key1": "anything3",
      "key2" : "more3"
    }
  }
}
Copy after login

To parse this configuration into a struct, one might define:

type Thing struct {
  Name string  `?????`
  Key1 string  `json:"key2"`
  Key2 string  `json:"key2"`
}
Copy after login

However, the question arises: how can you unmarshal the dynamic keys as struct field names?

Solution

To handle dynamic keys, consider using a map:

type X struct {
    Things map[string]Thing
}

type Thing struct {
    Key1 string
    Key2 string
}
Copy after login

Unmarshal like:

var x X
if err := json.Unmarshal(data, &x); err != nil {
    // handle error
}
Copy after login

Playground Example

If the key must be a member of the struct, you can use a loop to add it after unmarshalling:

type Thing struct {
    Name string `json:"-"` // Add the field
    Key1 string
    Key2 string
}

...

// Fix the name field after unmarshal
for k, t := range x.Things {
    t.Name = k
    x.Things[k] = t
}
Copy after login

Playground Example

Using these techniques, you can effectively unmarshal dynamic JSON keys into struct fields in Go, even when using libraries like Viper.

The above is the detailed content of How to Unmarshal Dynamic Viper or JSON Keys as Struct Fields in Go?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
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
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template