in src/Analyzer.JsonRuleEngine/Converters/ExpressionConverter.cs [49:96]
public override ExpressionDefinition ReadJson(JsonReader reader, Type objectType, [AllowNull] ExpressionDefinition existingValue, bool hasExistingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
{
return null;
}
reader.DateParseHandling = DateParseHandling.None;
var jsonObject = JObject.Load(reader);
var objectPropertyNames = jsonObject.Properties().Select(property => property.Name).ToList();
var expressionPropertyCount = objectPropertyNames.Count(property => ExpressionJsonPropertyNames.Contains(property));
if (expressionPropertyCount == 1)
{
if (objectPropertyNames.Contains("allOf", StringComparer.OrdinalIgnoreCase))
{
var allOfExpressionDefinition = CreateExpressionDefinition<AllOfExpressionDefinition>(jsonObject, serializer);
allOfExpressionDefinition.Validate();
return allOfExpressionDefinition;
}
else if (objectPropertyNames.Contains("anyOf", StringComparer.OrdinalIgnoreCase))
{
var anyOfExpressionDefinition = CreateExpressionDefinition<AnyOfExpressionDefinition>(jsonObject, serializer);
anyOfExpressionDefinition.Validate();
return anyOfExpressionDefinition;
}
else if (objectPropertyNames.Contains("not", StringComparer.OrdinalIgnoreCase))
{
var notExpressionDefinition = CreateExpressionDefinition<NotExpressionDefinition>(jsonObject, serializer);
notExpressionDefinition.Validate();
return notExpressionDefinition;
}
return CreateExpressionDefinition<LeafExpressionDefinition>(jsonObject, serializer);
}
var lineInfo = jsonObject as IJsonLineInfo;
var parsingErrorDetails = $"Path '{jsonObject.Path}', line {lineInfo.LineNumber}, position {lineInfo.LinePosition}.";
throw new JsonSerializationException(expressionPropertyCount > 1 ?
$"Too many expressions specified in evaluation. Only one is allowed. {parsingErrorDetails}" :
$"Invalid evaluation in JSON. No expressions are specified (must specify exactly one). {parsingErrorDetails}");
}