using Newtonsoft.Json.Schema;
public static void Main()
var jsonSchemaGenerator = new JsonSchemaGenerator();
var myType = typeof(SoilTest);
var schema = jsonSchemaGenerator.Generate(myType);
schema.Title = myType.Name;
Console.WriteLine(schema);
public DateTime Date { get; set; }
public string TestArea { get; set; }
public string TestLine { get; set; }
public string SoilType { get; set; }
public int Depth { get; set; }
public bool UnknownSoil { get; set; }
public bool TargetApplicable { get; set; }
public Nutrient PH { get; set; }
public Nutrient OlsenP { get; set; }
public Nutrient Potassium { get; set; }
public Nutrient SulphateSulphur { get; set; }
public Magnesium Magnesium { get; set; }
public double Calcium { get; set; }
public double Sodium { get; set; }
public Nutrient(TargetInfoValue targetInfo)
TargetInfoValue = targetInfo;
public double Value { get; set; }
public NutrientRange NutrientRange { get; set; }
public string TargetInfoText => TargetInfoValue.ToDisplayString();
public TargetInfoValue TargetInfoValue { get; private set; }
public class NutrientRange
public double Min { get; set; }
public double Max { get; set; }
public Magnesium(TargetInfoValue targetInfo)
TargetInfoValue = targetInfo;
public double Value { get; set; }
public NutrientRange PastureNutrientRange { get; set; }
public NutrientRange AnimalNutrientRange { get; set; }
public string TargetInfoText => TargetInfoValue.ToDisplayString();
public TargetInfoValue TargetInfoValue { get; private set; }
public enum TargetInfoValue
public static class TargetInfoValueExtensions {
public static string ToDisplayString(this TargetInfoValue value) {
case TargetInfoValue.High:
case TargetInfoValue.Low:
case TargetInfoValue.InRange:
case TargetInfoValue.NotInRange:
case TargetInfoValue.HighForPasture:
return "High for Pasture";
case TargetInfoValue.LowForAnimal:
case TargetInfoValue.TargetUnknown:
case TargetInfoValue.TargetAndSoilUnknown:
throw new ArgumentOutOfRangeException(nameof(value), value, "Unknown TargetInfoValue");