using System.Collections.Generic;
using System.Text.Json.Serialization;
using System.Text.RegularExpressions;
public static void Main()
var options = new JsonSerializerOptions
PropertyNameCaseInsensitive = true,
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
""name"": ""buildingStreet"",
""fieldValidation"": ""street"",
""fieldValidation"": ""price"",
""sectionId"": ""differentSection"",
""fieldValidation"": ""cartype1"",
""sectionId"": ""vehicleSection"",
""fieldValidation"": ""cartype2"",
""sectionId"": ""licenseSection"",
""name"": ""licensePlateNumber"",
""fieldValidation"": ""license"",
""conditionalMandatory"": [
""sectionId"": ""vehicleSection"",
""value"": [""kia"", ""honda""],
""sectionId"": ""differentSection"",
""value"": [""kia"", ""honda""],
var fieldParameterTableJson = @"
{ ""FieldName"": ""price"", ""MaxLength"": 10, ""ValidationRule"": ""^[0-9]+(\\\\.[0-9]{1,2})?$"", ""PlaceHolder"": ""$0.00""},
{ ""FieldName"": ""street"", ""MaxLength"": 50, ""ValidationRule"": ""^[A-Za-z0-9\\s]+$"", ""PlaceHolder"": ""Enter Street""},
{ ""FieldName"": ""license"", ""MaxLength"": 8, ""ValidationRule"": ""^[A-Z0-9]+$"", ""PlaceHolder"": ""Enter Plate Number""},
{ ""FieldName"": ""cartype1"", ""MaxLength"": 20, ""ValidationRule"": ""^[A-Za-z\\\\s]+$"", ""PlaceHolder"": ""Enter Car Type""},
{ ""FieldName"": ""cartype2"", ""MaxLength"": 20, ""ValidationRule"": ""^[A-Za-z\\\\s]+$"", ""PlaceHolder"": ""Enter Car Type""}
var formSchema = JsonSerializer.Deserialize<List<FormField>>(formSchemaJson, options);
var fieldParameters = JsonSerializer.Deserialize<List<FieldParameter>>(fieldParameterTableJson, options);
""name"": ""buildingStreet"",
""value"": ""123 Main St""
""sectionId"": ""differentSection"",
""sectionId"": ""vehicleSection"",
""sectionId"": ""licenseSection"",
""name"": ""licensePlateNumber"",
Root root = JsonSerializer.Deserialize<Root>(json, options);
var isValid = ValidateFormData(formSchema, fieldParameters, root.Fields, string.Empty, root.Fields);
Console.WriteLine($"Form is valid: {isValid}");
private static FormField? FindSectionSchema(IEnumerable<FormField> schema, string sectionId)
foreach (var formField in schema)
if (formField.SectionId == sectionId)
if (formField.Fields != null && formField.Fields.Any())
var nestedResult = FindSectionSchema(formField.Fields, sectionId);
if (nestedResult != null)
private static Field? FindFormDataSection(IEnumerable<Field> FormData, string sectionId)
foreach (Field field in FormData)
if (field.SectionId == sectionId)
if (field.Fields != null && field.Fields.Any())
var nestedResult = FindFormDataSection(field.Fields, sectionId);
if (nestedResult != null)
private static Field? FindField(IEnumerable<Field> FormData, string sectionId, string name)
Field Section = FindFormDataSection(FormData, sectionId);
Field Found = Section.Fields.Where(x=>x.Name == name).ToList().FirstOrDefault();
public static bool ValidateFormData(IEnumerable<FormField> schema, IEnumerable<FieldParameter> parameters, IEnumerable<Field> formData, string currentSection, IEnumerable<Field> allFormData)
Console.WriteLine("validate formdata start");
foreach (Field field in formData)
Console.WriteLine(count++);
Console.WriteLine($"current field - Name: {field.Name}, Value: {field.Value}, SectionId: {field.SectionId}");
Console.WriteLine($"current section - {currentSection}");
if (string.IsNullOrEmpty(field.Name))
currentSection = field.SectionId ?? string.Empty;
if (field.Fields != null && field.Fields.Any() && !string.IsNullOrEmpty(currentSection))
isValid = ValidateFormData(schema, parameters, field.Fields, currentSection, allFormData);
if (!isValid) return false;
FormField? foundSchema = null;
if (string.IsNullOrEmpty(currentSection))
foundSchema = schema.FirstOrDefault(s => s.Name == field.Name);
var sectionSchema = FindSectionSchema(schema, currentSection);
if (sectionSchema != null && sectionSchema.Fields != null)
foundSchema = sectionSchema.Fields.FirstOrDefault(s => s.Name == field.Name);
Console.WriteLine($"current schema - Name: {foundSchema.Name}, Value: {foundSchema.FieldValidation}, SectionId: {foundSchema.SectionId}");
Console.WriteLine($"No schema found for field: {field.Name}");
FieldParameter FieldValidation = parameters.Where(parameters => parameters.FieldName == foundSchema.FieldValidation).ToList().FirstOrDefault();
if (FieldValidation != null)
Console.WriteLine($"current validation - Name: {FieldValidation.FieldName}, Validation Regex: {FieldValidation.ValidationRule}");
Console.WriteLine($"No FieldValidation found for field: {field.Name}");
bool conditionalMandatory = false;
if (foundSchema.ConditionalMandatory != null)
Console.WriteLine($"Conditional Mandatory found {foundSchema.ConditionalMandatory}");
foreach (var x in foundSchema.ConditionalMandatory)
conditionalMandatory = checkConditionalMandatory(allFormData, x);
if(conditionalMandatory) break;
isValid = validateField(field, foundSchema, FieldValidation, conditionalMandatory);
private static bool checkConditionalMandatory(IEnumerable<Field> formData, ConditionalMandatory conditionalMandatory)
switch(conditionalMandatory.Type)
foreach(var condition in conditionalMandatory.Conditions)
Field conditionField = FindField(formData, condition.SectionId, condition.Name);
if(checkConditionMandatoryField(conditionField, condition)) return true;
private static bool checkConditionMandatoryField(Field field, Conditional condition)
foreach(var val in condition.Value)
public static bool validateField(Field field, FormField schema, FieldParameter validation, bool conditionalField)
if ((schema.Mandatory || conditionalField) && string.IsNullOrEmpty(field.Value))
Console.WriteLine($"Field '{field.Name}' in section '{field.SectionId}' is mandatory but missing.");
if (validation != null && !string.IsNullOrEmpty(field.Value))
if (field.Value.Length > validation.MaxLength)
Console.WriteLine($"Field '{field.Name}' in section '{field.SectionId}' exceeds max length of {validation.MaxLength}.");
if (!string.IsNullOrEmpty(validation.ValidationRule) &&
!Regex.IsMatch(field.Value, validation.ValidationRule))
Console.WriteLine($"Field '{field.Name}' in section '{field.SectionId}' does not match the validation rule: {validation.ValidationRule}");
public string Name { get; set; }
public string FieldValidation { get; set; }
public bool Mandatory { get; set; }
public List<ConditionalMandatory> ConditionalMandatory { get; set; }
public string SectionId { get; set; } = string.Empty;
public List<FormField> Fields { get; set; }
public string Name { get; set; }
public List<string> Value { get; set; }
public string SectionId { get; set; }
public string Type { get; set; }
public class ConditionalMandatory
public string Type { get; set; }
public List<Conditional> Conditions { get; set; }
public class FieldParameter
public string FieldName { get; set; }
public int MaxLength { get; set; }
public string ValidationRule { get; set; }
public string PlaceHolder { get; set; }
public List<Field> Fields { get; set; }
public string Name { get; set; }
public string Value { get; set; }
public string SectionId { get; set; }
public List<Field> Fields { get; set; }