niljson/README.md
Winni Neessen d558f5dffb
Add detailed README documentation with examples.
Expand the README to include license information, badges, and detailed documentation. Also provide example usage of the `niljson` package to help users understand how to integrate and use nullable JSON fields in their Go applications.
2024-09-01 16:46:02 +02:00

3.4 KiB

niljson - A simple Go package for unmarshalling null-able JSON types

GoDoc codecov Go Report Card REUSE status buy ma a coffee

niljson provides a simple and efficient way to handle nullable JSON fields during the unmarshalling 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, bool. These types can all be either 0 (as value) or null. In Go you can always work with pointers but these, of course, can lead to unhandled nil pointer dereferences.

niljaon 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.
  • Seamless Integration: These types work just like Go's standard types but add support for null values, enabling cleaner and more maintainable code.
  • JSON Unmarshalling Support: Automatically handles the unmarshalling of JSON fields, converting null JSON values to Go's nil 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(`{"string":"test", "int":123, "int64": 12345678901234, "float64":0, "nil":null, "bool":true}`)
    
    var example JSONType
    if err := json.Unmarshal(data, &example); err != nil {
        fmt.Println("failed to unmarshal JSON:", err)
        os.Exit(1)
    }

    if example.Bool.NotNil() {
        fmt.Printf("Bool is: %t\n", example.Bool.Value())
    }
	if example.Float64.IsNil() {
		fmt.Println("Float 32 is NIL")
	}
	if example.Float64.NotNil() {
		fmt.Printf("Float is: %f\n", example.Float64.Value())
	}
    if !example.String.IsNil() {
        fmt.Printf("String is: %s\n", example.String.Value())
    }
}