<PackageReference Include="NJsonSchema" Version="9.10.49" />

SampleJsonSchemaGenerator

Generates a JSON Schema from sample JSON data.
using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; namespace NJsonSchema.Generation { public class SampleJsonSchemaGenerator { public JsonSchema4 Generate(string json) { JToken token = JsonConvert.DeserializeObject<JToken>(json, new JsonSerializerSettings { DateFormatHandling = DateFormatHandling.IsoDateFormat }); JsonSchema4 jsonSchema = new JsonSchema4(); Generate(token, jsonSchema, jsonSchema); return jsonSchema; } private void Generate(JToken token, JsonSchema4 schema, JsonSchema4 rootSchema) { if (schema != rootSchema && token.Type == JTokenType.Object) { JsonSchema4 jsonSchema = new JsonSchema4(); AddSchemaDefinition(rootSchema, jsonSchema); schema.Reference = jsonSchema; GenerateWithoutReference(token, jsonSchema, rootSchema); } else GenerateWithoutReference(token, schema, rootSchema); } private void GenerateWithoutReference(JToken token, JsonSchema4 schema, JsonSchema4 rootSchema) { if (token != null) { switch (token.Type) { case JTokenType.Object: GenerateObject(token, schema, rootSchema); break; case JTokenType.Array: GenerateArray(token, schema, rootSchema); break; case JTokenType.Date: schema.Type = JsonObjectType.String; schema.Format = ((token.Value<DateTime>() == token.Value<DateTime>().Date) ? "date" : "date-time"); break; case JTokenType.String: schema.Type = JsonObjectType.String; break; case JTokenType.Boolean: schema.Type = JsonObjectType.Boolean; break; case JTokenType.Integer: schema.Type = JsonObjectType.Integer; break; case JTokenType.Float: schema.Type = JsonObjectType.Number; break; case JTokenType.Bytes: schema.Type = JsonObjectType.String; schema.Format = "byte"; break; case JTokenType.TimeSpan: schema.Type = JsonObjectType.String; schema.Format = "time-span"; break; case JTokenType.Guid: schema.Type = JsonObjectType.String; schema.Format = "guid"; break; case JTokenType.Uri: schema.Type = JsonObjectType.String; schema.Format = "uri"; break; } if (schema.Type == JsonObjectType.String && Regex.IsMatch(token.Value<string>(), "^[0-2][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$")) schema.Format = "date"; if (schema.Type == JsonObjectType.String && Regex.IsMatch(token.Value<string>(), "^[0-2][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9](:[0-9][0-9])?$")) schema.Format = "date-time"; if (schema.Type == JsonObjectType.String && Regex.IsMatch(token.Value<string>(), "^[0-9][0-9]:[0-9][0-9](:[0-9][0-9])?$")) schema.Format = "time-span"; } } private void GenerateObject(JToken token, JsonSchema4 schema, JsonSchema4 rootSchema) { schema.Type = JsonObjectType.Object; foreach (JProperty item in ((JObject)token).Properties()) { JsonProperty jsonProperty = new JsonProperty(); Generate(item.Value, jsonProperty, rootSchema); schema.Properties[item.Name] = jsonProperty; } } private void GenerateArray(JToken token, JsonSchema4 schema, JsonSchema4 rootSchema) { schema.Type = JsonObjectType.Array; List<JsonSchema4> list = ((JArray)token).Select(delegate(JToken item) { JsonSchema4 jsonSchema = new JsonSchema4(); GenerateWithoutReference(item, jsonSchema, rootSchema); return jsonSchema; }).ToList(); if (list.Count == 0) schema.Item = new JsonSchema4(); else if ((from s in list group s by s.Type).Count() == 1) { MergeAndAssignItemSchemas(rootSchema, schema, list); } else { schema.Item = list.First(); } } private void MergeAndAssignItemSchemas(JsonSchema4 rootSchema, JsonSchema4 schema, List<JsonSchema4> itemSchemas) { JsonSchema4 jsonSchema = itemSchemas.First(); JsonSchema4 jsonSchema2 = new JsonSchema4 { Type = jsonSchema.Type }; if (jsonSchema.Type == JsonObjectType.Object) { foreach (IGrouping<string, KeyValuePair<string, JsonProperty>> item in from p in itemSchemas.SelectMany((JsonSchema4 s) => s.Properties) group p by p.Key) { jsonSchema2.Properties[item.Key] = item.First().Value; } } AddSchemaDefinition(rootSchema, jsonSchema2); schema.Item = new JsonSchema4 { Reference = jsonSchema2 }; } private void AddSchemaDefinition(JsonSchema4 rootSchema, JsonSchema4 schema) { rootSchema.Definitions["Anonymous" + (rootSchema.Definitions.Count + 1)] = schema; } } }