Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/markrosemaker/jsonutil
Provides custom JSON v2 marshaling and unmarshaling functions for specific data types, e.g. JSON encoding and decoding for types like time.Duration and url.URL.
https://github.com/markrosemaker/jsonutil
golang json json-v2 marshal marshaller time-duration unmarshal unmarshaller url
Last synced: 8 days ago
JSON representation
Provides custom JSON v2 marshaling and unmarshaling functions for specific data types, e.g. JSON encoding and decoding for types like time.Duration and url.URL.
- Host: GitHub
- URL: https://github.com/markrosemaker/jsonutil
- Owner: MarkRosemaker
- License: mit
- Created: 2024-11-21T14:56:01.000Z (about 2 months ago)
- Default Branch: master
- Last Pushed: 2024-12-23T11:05:51.000Z (25 days ago)
- Last Synced: 2024-12-23T12:21:00.936Z (25 days ago)
- Topics: golang, json, json-v2, marshal, marshaller, time-duration, unmarshal, unmarshaller, url
- Language: Go
- Homepage:
- Size: 514 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# JSON v2 Utilities
[![Go Reference](https://pkg.go.dev/badge/github.com/MarkRosemaker/jsonutil.svg)](https://pkg.go.dev/github.com/MarkRosemaker/jsonutil)
[![Go Report Card](https://goreportcard.com/badge/github.com/MarkRosemaker/jsonutil)](https://goreportcard.com/report/github.com/MarkRosemaker/jsonutil)
![Code Coverage](https://img.shields.io/badge/coverage-100%25-brightgreen)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE)
`jsonutil` is a Go package that provides custom [JSON v2](https://github.com/go-json-experiment/json) marshaling and unmarshaling functions for specific data types.
This package is particularly useful when you need to handle JSON encoding and decoding for types like `time.Duration` and `url.URL` in a customized manner.
## Features
* Custom marshaler and unmarshaler for `url.URL`:
* `URLMarshal` marshals `url.URL` as a string.
* `URLUnmarshal` unmarshals `url.URL` from a string.
* Custom marshaler and unmarshaler for `time.Duration`:
* `DurationMarshalIntSeconds` marshals `time.Duration` as an integer representing seconds.
* `DurationUnmarshalIntSeconds` unmarshals `time.Duration` from an integer assuming it represents seconds.## Installation
To install the library, use the following command:
```shell
go get github.com/MarkRosemaker/jsonutil
```## Usage
### Custom Marshaling and Unmarshaling for `url.URL`
To use the custom marshaler and unmarshaler for `url.URL`, you can import the package and use the provided functions:
```go
package mainimport (
"fmt"
"net/url""github.com/MarkRosemaker/jsonutil"
"github.com/go-json-experiment/json"
)var jsonOpts = json.JoinOptions(
json.WithMarshalers(json.NewMarshalers(json.MarshalFuncV2(jsonutil.URLMarshal))),
json.WithUnmarshalers(json.NewUnmarshalers(json.UnmarshalFuncV2(jsonutil.URLUnmarshal))),
)type MyStruct struct {
Foo string `json:"foo"`
Link url.URL `json:"link"`
}func main() {
out := &MyStruct{}
if err := json.Unmarshal([]byte(`{"foo":"bar","link":"https://example.com/"}`), out, jsonOpts); err != nil {
panic(err)
}if out.Link.String() != "https://example.com/" {
panic("something went wrong")
}res, err := json.Marshal(MyStruct{
Foo: "baz",
Link: url.URL{Scheme: "http", Host: "example.com", Path: "/some-path"},
}, jsonOpts)
if err != nil {
panic(err)
}fmt.Println(string(res))
// Output: {"foo":"baz","link":"http://example.com/some-path"}
}
```### Custom Marshaling and Unmarshaling for `time.Duration`
To use the custom marshaler and unmarshaler for `time.Duration`, you can import the package and use the provided functions:
```go
package mainimport (
"fmt"
"time""github.com/MarkRosemaker/jsonutil"
"github.com/go-json-experiment/json"
)var jsonOpts = json.JoinOptions(
json.WithMarshalers(json.MarshalFuncV2(jsonutil.DurationMarshalIntSeconds)),
json.WithUnmarshalers(json.UnmarshalFuncV2(jsonutil.DurationUnmarshalIntSeconds)),
)type MyStruct struct {
Foo string `json:"foo"`
Duration time.Duration `json:"duration"`
}func main() {
out := &MyStruct{}
if err := json.Unmarshal([]byte(`{"foo":"bar","duration":3}`), out, jsonOpts); err != nil {
panic(err)
}if out.Duration != 3*time.Second {
panic("something went wrong")
}res, err := json.Marshal(MyStruct{
Foo: "baz",
Duration: time.Minute,
}, jsonOpts)
if err != nil {
panic(err)
}fmt.Println(string(res))
// Output: {"foo":"baz","duration":60}
}
```## Contributing
If you have any contributions to make, please submit a pull request or open an issue on the [GitHub repository](https://github.com/MarkRosemaker/jsonutil).
## License
This project is licensed under the MIT License. See the [LICENSE](./LICENSE) file for details.