Bored of handling json from multiple different sources like Files, Http requests or responses?
You no longer have to be! ๐คฉ
JsonHandlers
Prerequisites
A go module where you want to integrate jsonhandlers. To create one, follow this guide.
Installation
go get github.com/abusomani/jsonhandlers
Usage
A very useful feature of Goโs import statement are aliases. A common use case for import aliases is to provide a shorter alternative to a libraryโs package name.
In this example, we save ourselves having to type jsonhandlers
everytime we want to call one of the libraryโs functions, we just use jh
instead.
import (
jh "github.com/abusomani/jsonhandlers"
)
Options
Jsonhandlers package exposes multiple options while creating a new jsonhandler
to be able to read/write json from sources like Files, Http Requests or Http responses.
WithFileHandler
You can use the WithFileHandler
option to read/write Json from/to a file. For this, you need to create a new jsonhandler with the file handler option.
Example to understand WithFileHandler
in more detail.
Sample Code
package operations
import (
"fmt"
"github.com/abusomani/jsonhandlers"
)
func GetStudentsFromFile() []student {
return handleFile()
}
func handleFile() []student {
jh := jsonhandlers.New(jsonhandlers.WithFileHandler(testFilePath))
var sch school
err := jh.Unmarshal(&sch)
handleError("error in unmarshalling %s", err)
fmt.Printf("School info is : %+v\n", sch)
// add a new student to the school
sch.Students = append(sch.Students[:2], student{
Id: 3,
Name: "The new student",
Branch: "AI",
})
err = jh.Marshal(sch)
handleError("error in marshalling %s", err)
fmt.Printf("Updated school info after admission of new student is : %+v\n", sch)
// remove the new student as he was very mischievous
sch.Students = sch.Students[:2]
err = jh.Marshal(sch)
handleError("error in marshalling %s", err)
fmt.Printf("Updated school info after retaining all good students is : %+v\n", sch)
return sch.Students
}
WithHTTPRequestHandler
You can use the WithHTTPRequestHandler
option to read Json from a Http Request and to write Json to a Http ResponseWriter. For this, you need to create a new jsonhandler with the Http request handler option.
Example to understand WithHTTPRequestHandler
in more detail.
Sample Code
package operations
import (
"net/http"
"github.com/abusomani/jsonhandlers"
)
type studentSearchRequest struct {
Name string
}
type studentSearchResponse struct {
Info student
}
func HandleHTTPRequest(students []student) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
jh := jsonhandlers.New(jsonhandlers.WithHTTPRequestHandler(w, r))
var reqBody studentSearchRequest
err := jh.Unmarshal(&reqBody)
if err != nil {
errPayload := struct {
StatusCode int
Message string
}{
StatusCode: http.StatusBadRequest,
Message: err.Error(),
}
// request is bad
jh.Marshal(errPayload)
return
}
for _, student := range students {
// student found
if student.Name == reqBody.Name {
// response has the right student info written
jh.Marshal(studentSearchResponse{
Info: student,
})
return
}
}
errPayload := struct {
StatusCode int
Message string
}{
StatusCode: http.StatusInternalServerError,
Message: "something went wrong",
}
// student not found
jh.Marshal(errPayload)
})
}
/*
Sample request to be hit on the localhost server to test WithHTTPRequestHandler functionality.
curl http://localhost:8080/search -d '{"Name": "Abhishek Somani"}'
*/
WithHTTPResponseHandler
You can use the WithHTTPResponseHandler
option to read/write Json from/to a Http Response. For this, you need to create a new jsonhandler with the Http response handler option.
Example to understand WithHTTPResponseHandler
in more detail.
Sample Code
package operations
import (
"fmt"
"log"
"net/http"
"github.com/abusomani/jsonhandlers"
)
type user struct {
Id int
FirstName string
LastName string
Age int
Gender string
Email string
}
type getUsersResponse struct {
Users []user
}
func HandleHTTPResponse() {
resp, err := http.Get("https://dummyjson.com/users")
if err != nil {
log.Fatalf("unable to make the get request %s", err.Error())
}
jh := jsonhandlers.New(jsonhandlers.WithHTTPResponseHandler(resp))
var userResp getUsersResponse
jh.Unmarshal(&userResp)
fmt.Printf("response is %+v\n", userResp)
}
Run examples
To run the examples present in the example folder you need to first checkout this package by doing a git clone
. Once you have checked out this package, then you can run the main.go using the following command to see all the examples in action:
go run example/main.go
Hope you enjoyed! โค๏ธ
Top comments (0)