Convert between json and Golang struct, using json4s as the json AST and scalacheck for random data generation.
Try it at json2struct-fe.
It's needed frequently to convert between http request/response body and struct types in Golang.
- json to Golang struct type
- struct type to json
- support struct type with json tag
- support both snake case & camel case of field names
- support struct type with comments
- support nested struct type
- rest api
- cli tool
- setup GITHUB_REPOSITORY_OWNER and GITHUB_TOKEN env variable to access github package registry.
sbt compile test
, compile and test it.sbt universal:packageBin
, package zip which lies in target/universal folder.- unzip the zip package,
run it by
bin/cli
orbin/api
script.
- core, the core conversion logic.
- cli, a simple cli tool that wraps the conversion logic, a zip is released for this module.
- api, a simple rest api that serves the conversion, a zip and a docker image are released for direct usage.
Json will be parsed to a sequence of struct types annotated with json tags. Below is the sample json and the generated struct types:
{
"id": "cmpl-uqkvlQyYK7bGYrRHQ0eXlWi7",
"object": "text_completion",
"created": 1589478378,
"model": "gpt-3.5-turbo",
"choices": [
{
"text": "\n\nThis is indeed a test",
"index": 0,
"logprobs": null,
"finish_reason": "length"
}
],
"usage": {
"prompt_tokens": 5,
"completion_tokens": 7,
"total_tokens": 12
}
}
type OpenAiResponse struct {
Id string `json:"id"`
Object string `json:"object"`
Created int `json:"created"`
Model string `json:"model"`
Choices []Choices `json:"choices"`
Usage Usage `json:"usage"`
}
type Choices struct {
Text string `json:"text"`
Index int `json:"index"`
Logprobs any `json:"logprobs"`
FinishReason string `json:"finish_reason"`
}
type Usage struct {
PromptTokens int `json:"prompt_tokens"`
CompletionTokens int `json:"completion_tokens"`
TotalTokens int `json:"total_tokens"`
}
Struct definitions will be parsed to a sequence of Struct AST. Each AST can be converted to a map filled with random data. Below is the sample struct types and generated json data:
type OpenAiResponse struct {
Id string `json:"id"`
Object string `json:"object"`
Created uint64 `json:"created"`
Model string `json:"model"`
Choices []Choice `json:"choices"`
Usage Usage `json:"usage"`
}
type Choice struct {
Index int `json:"index"`
Message Message `json:"message"`
FinishReason string `json:"finish_reason"`
}
type Usage struct {
PromptTokens int `json:"prompt_tokens"`
CompletionTokens int `json:"completion_tokens"`
TotalTokens int `json:"total_tokens"`
}
type Message struct {
Role string `json:"role"`
Content string `json:"content"`
}
{"model":"QC","choices":[{"index":482,"message":{"role":"cQUu2Gd","content":"NL"},"finish_reason":"Lckyp"},{"index":8,"message":{"role":"reH6","content":"o"},"finish_reason":"yMgu"},{"index":704,"message":{"role":"5X","content":"wXVmgIN"},"finish_reason":"mNl8"}],"usage":{"prompt_tokens":906,"completion_tokens":569,"total_tokens":930},"object":"5Y2li","id":"HSQ9","created":6840891044428693685}