nimjson generates nim object definitions from json documents. This was inspired by gojson.
- Nim (stable version)
nimjson
writes NilType
type if a value or a first value of an array is null.
Please fix NilType
type yourself.
% curl -s https://api.github.com/repos/jiro4989/nimjson | nimjson -O:Repository
type
NilType = ref object
Repository = ref object
id: int64
node_id: string
name: string
full_name: string
private: bool
owner: Owner
html_url: string
description: string
fork: bool
url: string
forks_url: string
keys_url: string
collaborators_url: string
teams_url: string
hooks_url: string
issue_events_url: string
events_url: string
assignees_url: string
branches_url: string
tags_url: string
blobs_url: string
git_tags_url: string
git_refs_url: string
trees_url: string
statuses_url: string
languages_url: string
stargazers_url: string
contributors_url: string
subscribers_url: string
subscription_url: string
commits_url: string
git_commits_url: string
comments_url: string
issue_comment_url: string
contents_url: string
compare_url: string
merges_url: string
archive_url: string
downloads_url: string
issues_url: string
pulls_url: string
milestones_url: string
notifications_url: string
labels_url: string
releases_url: string
deployments_url: string
created_at: string
updated_at: string
pushed_at: string
git_url: string
ssh_url: string
clone_url: string
svn_url: string
homepage: string
size: int64
stargazers_count: int64
watchers_count: int64
language: string
has_issues: bool
has_projects: bool
has_downloads: bool
has_wiki: bool
has_pages: bool
forks_count: int64
mirror_url: NilType
archived: bool
disabled: bool
open_issues_count: int64
license: License
allow_forking: bool
is_template: bool
topics: seq[string]
visibility: string
forks: int64
open_issues: int64
watchers: int64
default_branch: string
temp_clone_token: NilType
network_count: int64
subscribers_count: int64
Owner = ref object
login: string
id: int64
node_id: string
avatar_url: string
gravatar_id: string
url: string
html_url: string
followers_url: string
following_url: string
gists_url: string
starred_url: string
subscriptions_url: string
organizations_url: string
repos_url: string
events_url: string
received_events_url: string
`type`: string
site_admin: bool
License = ref object
key: string
name: string
spdx_id: string
url: string
node_id: string
% nimjson examples/primitive.json
type
NilType = ref object
Object = ref object
stringField: string
intField: int64
floatField: float64
boolField: bool
nullField: NilType
% nimjson examples/array.json
type
NilType = ref object
Object = ref object
strArray: seq[string]
intArray: seq[int64]
floatArray: seq[float64]
boolArray: seq[bool]
nullArray: seq[NilType]
emptyArray: seq[NilType]
% nimjson examples/object.json
type
NilType = ref object
Object = ref object
point: Point
length: int64
responseCode: string
debugFlag: bool
rectangles: seq[Rectangles]
Point = ref object
x: float64
y: float64
Rectangles = ref object
width: int64
height: int64
nimjson
supports partially JSON Schema.
nimjson
generates Nim type definition with JSON Schema when you enable -j
option.
$ nimjson -j examples/json_schema.json
type
Object = ref object
`type`: string
id: string
timestamp: string
stream: string
consumer: string
consumer_seq: string
stream_seq: string
deliveries: int64
domain: Option[string]
It is wrapped by default in the Option
type that properties not included in the required
parameter of JSON Schema.
If you don't want to use Option
type, you can use --disable-option-type
option.
$ nimjson -j --disable-option-type examples/json_schema.json
type
Object = ref object
`type`: string
id: string
timestamp: string
stream: string
consumer: string
consumer_seq: string
stream_seq: string
deliveries: int64
domain: string
nimjson
supports $ref
and $defs
keywords.
But it doesn't support URL of $ref
.
This is supported:
{
"$id": "https://example.com/product.schema.json",
"type": "object",
"properties": {
"product": { "$ref": "#/$defs/product" },
"product2": { "$ref": "#/$defs/product2" }
},
"$defs": {
"product": { "type": "string" },
"product2": { "type": "array", "items": { "type": "string" } }
}
}
This is NOT supported:
{
"$id": "https://example.com/product.schema.json",
"type": "object",
"properties": {
"product": { "$ref": "https://example.com/schemas/address" }
}
}
import nimjson
echo """{"keyStr":"str", "keyInt":1}""".toTypeString()
# Output:
# type
# NilType = ref object
# Object = ref object
# keyStr: string
# keyInt: int64
echo "examples/primitive.json".readFile().toTypeString("testObject")
# Output:
# type
# NilType = ref object
# TestObject = ref object
# stringField: string
# intField: int64
# floatField: float64
# boolField: bool
# nullField: NilType
JSON Schema:
import nimjson
echo "examples/json_schema.json".readFile().toTypeString("testObject", jsonSchema = true)
type
TestObject = ref object
`type`: string
id: string
timestamp: string
stream: string
consumer: string
consumer_seq: string
stream_seq: string
deliveries: int64
domain: Option[string]
nimble install nimjson
wget https://github.com/jiro4989/nimjson/releases/download/v3.0.0/nimjson_3.0.0_amd64.deb
sudo dpkg -i ./nimjson*.deb
yum install https://github.com/jiro4989/nimjson/releases/download/v3.0.0/nimjson-3.0.0-1.el7.x86_64.rpm
nimjson -h
nimjson generates nim object definitions from json documents.
Usage:
nimjson [options] [files...]
nimjson (-h | --help)
nimjson (-v | --version)
Options:
-h, --help Print this help
-v, --version Print version
-X, --debug Debug on
-o, --out-file:FILE_PATH Write file path
-O, --object-name:OBJECT_NAME Set object type name
-p, --public-field Public fields
-q, --quote-field Quotes all fields
-j, --json-schema Read JSON as JSON Schema format
--disable-option-type (Only JSON Schema) Disable using Option type
MIT
I created simple nimjson on web application.
https://jiro4989.github.io/nimjson
Javascript library of nimjson of the application is generated by this
module (nimble js
).