A simple helper library to generate default JSON from a JSONSchema. Written in .NET standard for maximum portability and proudly JSON.net and Newtonsoft.Json.Schema driven.
You can install it from Nuget using
PM> Install-Package NerdCats.JsonSchemaDefaults
Clone the repo, run dotnet restore
and dotnet build
. Built on Visual Studio 2017 with .net core SDK 1.1.0
Sample JSON schema:
{
"title": "Album Options",
"type": "object",
"properties": {
"sort": {
"type" : "string",
"default": "id"
},
"per_page" : {
"default" : 30,
"type": "integer"
}
}
}
To generate a JSON with all default values defined here use SchemaDefaultGenerator
like the following:
var schemaDefaultGenerator = new SchemaDefaultGenerator();
var defaultJSON = schemaDefaultGenerator.GetDefaults(JObject.Parse("{" +
"\"title\": \"Album Options\", " +
"\"type\": \"object\"," +
"\"properties\": {" +
" \"sort\": {" +
" \"type\": \"string\"," +
" \"default\": \"id\"" +
" }," +
" \"per_page\": {" +
" \"default\": 30," +
" \"type\": \"integer\"" +
" }" +
"}}"));
var expectedResult = JObject.Parse("{ sort: 'id', per_page: 30 }");
Assert.IsTrue(JToken.DeepEquals(defaultJSON, expectedResult));
Generated default JSON would be :
{
"sort": "id",
"per_page": 30
}
You can also opt for the sweet extension method for JSchema
class like the following:
var schema = JSchema.Parse("{" +
"\"title\": \"Album Options\", " +
"\"type\": \"object\"," +
"\"properties\": {" +
" \"sort\": {" +
" \"type\": \"string\"," +
" \"default\": \"id\"" +
" }," +
" \"per_page\": {" +
" \"default\": 30," +
" \"type\": \"integer\"" +
" }" +
"}}");
var defaultJSON = schema.GetDefaultJSON();
var expectedResult = JObject.Parse("{ sort: 'id', per_page: 30 }");
Assert.IsTrue(JToken.DeepEquals(defaultJSON, expectedResult));
Let's up the ante a bit with local references and allOf operator
Sample JSON schema:
{
"type": "object",
"properties": {
"farewell_to_arms": {
"allOf": [
{
"$ref": "#/definitions/book"
},
{
"properties": {
"price": {
"default" : 30,
}
}
}
]
},
"for_whom_the_bell_tolls": {
"allOf": [
{
"$ref": "#/definitions/book"
},
{
"properties": {
"price": {
"default": 100
}
}
}
]
}
},
"definitions": {
"book": {
"type": "object" ,
"properties": {
"author": {
"type": "string",
"default": "Hemingway",
},
"price": {
"type": "integer",
"default": 10,
}
}
}
}
}
To generate a default JSON from this let's go the same way we have gone a moment ago
var schemaDefaultGenerator = new SchemaDefaultGenerator();
var schemaJson = "{" +
"type: 'object'," +
"properties: {" +
"farewell_to_arms: { " +
"allOf: [" +
"{'$ref': '#/definitions/book'}," +
"{'properties': {" +
"price: {" +
"default : 30" +
"}" +
"}" +
"}]" +
"}," +
"for_whom_the_bell_tolls: {" +
"allOf: [" +
"{'$ref': '#/definitions/book'}, " +
"{ properties: { " +
" price: { " +
"default: 100 " +
"}" +
"}" +
"}" +
"]" +
"}" +
"}," +
"definitions: {" +
"book: {" +
"type: 'object'," +
"properties: {" +
"author: {" +
"type: 'string'," +
"default: 'Hemingway'" +
"}," +
"price: {" +
"type: 'integer'," +
"default: 10" +
"}" +
"}" +
"}" +
"}" +
"}";
var defaultJson = schemaDefaultGenerator.GetDefaults(schemaJson);
var expectedDefault = JObject.Parse("{ farewell_to_arms: { author: 'Hemingway', price: 30 }, for_whom_the_bell_tolls: { author: 'Hemingway', price: 100 } }");
Assert.IsTrue(JToken.DeepEquals(defaultJson, expectedDefault));
The resultant default JSON would look like
{
"farewell_to_arms": {
"author": "Hemingway",
"price": 30
},
"for_whom_the_bell_tolls": {
"author": "Hemingway",
"price": 100
}
}
This library conforms to JsonSchema draft 4. This still doesn't support default values for anyOf
and oneOf
operator defaults.
- Swagata 'thehoneymad' Prateek @SwagataPrateek
Thanks goes to Eugene Tsypkin for json-schema-defaults for inspiration.
Released under the terms of the MIT License.