mirror of
https://github.com/wneessen/niljson.git
synced 2024-12-22 10:20:38 +01:00
A simple Go package for unmarshalling null-able JSON types
Winni Neessen
74b7a30950
Some checks failed
CodeQL / Analyze (push) Has been cancelled
golangci-lint / lint (push) Has been cancelled
Govulncheck Security Scan / test (push) Has been cancelled
REUSE Compliance Check / test (push) Has been cancelled
Scorecard supply-chain security / Scorecard analysis (push) Has been cancelled
SonarQube / Build and analyze (push) Has been cancelled
Bump codecov/codecov-action from 5.1.1 to 5.1.2 |
||
---|---|---|
.github | ||
LICENSES | ||
.gitignore | ||
.golangci.toml | ||
go.mod | ||
LICENSE | ||
niljson.go | ||
niljson_test.go | ||
README.md | ||
SECURITY.md | ||
sonar-project.properties |
niljson - A simple Go package for (un-)marshalling null-able JSON types
niljson provides a simple and efficient way to handle nullable JSON fields during the (un-)marshalling process.
In JSON, it's common to encounter fields that can be null
, but handling these fields in Go can be cumbersome,
especially when dealing with primitive types like int
, float64
, and bool
. These types can all be either 0
(as a value) or null
. In Go you can always work with pointers, but these can lead to unhandled nil
pointer dereferences.
niljson addresses this challenge by offering a set of types that can seamlessly handle null
values during
unmarshalling, allowing your Go applications to work with JSON data more naturally and with fewer boilerplate
checks for nil
values.
Key Features
- Nullable Types: Provides a range of nullable types (
NilString
,NilInt
,NilFloat
,NilBool
, etc.) that are easy to use and integrate into your existing Go structs. - JSON Unmarshalling Support: Automatically handles the (un-)marshalling of JSON fields, converting
null
JSON values to Go'snil
or zero values, depending on the context. - Minimalistic and Lightweight: Designed to be lightweight and unobtrusive, so it won't bloat your application or introduce unnecessary dependencies (only relies on the Go standard library)
Example Usage
package main
import (
"encoding/json"
"fmt"
"os"
"github.com/wneessen/niljson"
)
type JSONType struct {
Bool niljson.NilBoolean `json:"bool"`
Float32 niljson.NilFloat32 `json:"float32,omitempty"`
Float64 niljson.NilFloat64 `json:"float64"`
Int niljson.NilInt `json:"int"`
Int64 niljson.NilInt64 `json:"int64"`
NullString niljson.NilString `json:"nil"`
String niljson.NilString `json:"string"`
}
func main() {
data := []byte(`{
"bytes": "Ynl0ZXM=",
"bool": true,
"float32": null,
"float64":0,
"int": 123,
"int64": 12345678901234,
"nilvalue": null,
"string":"test"
}`)
var example JSONType
var output string
if err := json.Unmarshal(data, &example); err != nil {
fmt.Println("failed to unmarshal JSON:", err)
os.Exit(1)
}
if example.Bool.NotNil() {
output += fmt.Sprintf("Bool is: %t, ", example.Bool.Value())
}
if example.Float32.IsNil() {
output += "Float 32 is nil, "
}
if example.Float64.NotNil() {
output += fmt.Sprintf("Float 64 is: %f, ", example.Float64.Value())
}
if example.String.NotNil() {
output += fmt.Sprintf("String is: %s", example.String.Value())
}
fmt.Println(output)
data, err := json.Marshal(&example)
if err != nil {
fmt.Printf("failed to marshal JSON: %s", err)
os.Exit(1)
}
fmt.Println(data)
}