Profile
Back to NewsBack
GitHub Trending 2 min
Reader Mode
icza/dyno: Package dyno is a utility to work with dynamic objects at ease.

icza/dyno: Package dyno is a utility to work with dynamic objects at ease.

15 hours ago

dyno

!Build Status Go Reference</a> Go Report Card</a> codecov</a>

Package dyno is a utility to work with _dynamic objects_ at ease.

Primary goal is to easily handle dynamic objects and arrays (and a mixture of these) that are the result of unmarshaling a JSON or YAML text into an interface{} for example. When unmarshaling into interface{}, libraries usually choose either map[string]interface{} or map[interface{}]interface{} to represent objects, and []interface{} to represent arrays. Package dyno supports a mixture of these in any depth and combination.

When operating on a dynamic object, you designate a value you're interested in by specifying a _path_. A path is a _navigation_; it is a series of map keys and int slice indices that tells how to get to the value.

Should you need to marshal a dynamic object to JSON which contains maps with interface{} key type (which is not supported by encoding/json), you may use the ConvertMapI2MapS converter function.

The implementation does not use reflection at all, so performance is rather good.

Supported Operations

  • Specialized get for maps with string keys: SGet
  • Set a value denoted by a path: Set
  • Specialized set for maps with string keys: SSet
  • Delete a key from a map or an element from a slice denoted by a path: Delete

Example

Let's see a simple example editing a JSON text to mask out a password. This is a simplified version of the Example_jsonEdit example function:

src := {"login":{"password":"secret","user":"bob"},"name":"cmpA"} var v interface{} if err := json.Unmarshal([]byte(src), &v); err != nil { panic(err) } // Edit (mask out) password: if err = dyno.Set(v, "xxx", "login", "password"); err != nil { fmt.Printf("Failed to set password: %v\n", err) } edited, err := json.Marshal(v) fmt.Printf("Edited JSON: %s, error: %v\n", edited, err)

Output will be:

Edited JSON: {"login":{"password":"xxx","user":"bob"},"name":"cmpA"}, error:

Chat with me