public override ExpressionDefinition ReadJson()

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}");
        }