loading...

Golang New JSON parser/interpreter

eco9999 profile image eco9999 ・2 min read

Hi gophers and other fellow life forms.

About 6 months ago we have started a new project that font-end side with JS/Node.js/React and back-end side with Golang. I was working for the back-end side everything was O.K. But the project grows the 'encoding/json' package get inefficient. For example we are not able to change a 'key' or change any value with something else. Thats because we switch to some custom packages for manipulating JSON.

At this point. I figure out 'How about I wrote a packege for JSON manipulating'

And than I start working on it. But dealing with such a project was not easy.

First I had to find a way to validate my result. Manually writing unit tests was impossible for large data. Thats because I started to integrate Node.js to this project for test-case creation and validation. And it worked perfectly.

I use a continius integration platform for test automation. And wrote a detailed documentation on GoDoc.

And It has a cool gopher logo you should see :)

Well today its finally ready for public release.

Name of this package is JIN

It is super easy to use and much more important its super fast.
I just want to share with this to you guys.

Let's look at with an example.

    // this is the JSON we will work on
    data := []byte(`{"repo":{"name":"ecoshub/jin"},"others":["jin","dev.to"]}`)

we are going to try to access the 'dev.to' string in 'others' array.

    // In order to Unmarshal a JSON.
    // first we have to define those structs properly.
    type Repository struct {
        Name string         `json:"name"`
    }

    type Data struct {
        Repo   Repository   `json:"repo"`
        Others []string     `json:"others"`
    }
    // an empty data struct
    var newData Data

    // finally Unmarshaling.
    err := json.Unmarshal(data, &newData)

    // standard error implementation.
    if err != nil {
        fmt.Println("error:", err)
    }
    fmt.Prinln(newData.Others[1])

Or you can use this. with no struct defination.

    // just one line of code.
    value, err := jin.Get(data, "others", "1")

    // standard error implementation.
    if err != nil {
        fmt.Println("error:", err)
    }
    fmt.Println(string(value))

Do not miss-understand me I am not the first person who figure out this simple and elegant definition. I am just trying to expand and improve JSON manipulation.

This package has over 90 functions/methods for ease JSON manipulation, build and formating needs. Some useful functions that i like to mention.

-Add(), AddKeyValue(), Set(), SetKey() Delete(), Insert(), IterateArray(), IterateKeyValue() Tree().

There is a very detailed explanations and lots of examples in GoDoc .

Also I think you have to check out benchmark results :)

This is the link of repository:
https://github.com/ecoshub/jin

Please do not hesitate to fork/clone pull-request.

Thank you so much for your time.

Have a good day.

Discussion

pic
Editor guide