예제 #1
0
        private static MODEL _Read(TextReader textReader, ReadSettings settings)
        {
            Guard.NotNull(textReader, nameof(textReader));
            Guard.NotNull(settings, nameof(settings));

            using (var reader = new JsonTextReader(textReader))
            {
                var root = new MODEL();

                reader.Read();
                root.Deserialize(reader);

                var ex = root.Validate().FirstOrDefault();
                if (ex != null)
                {
                    throw ex;
                }

                foreach (var buffer in root._buffers)
                {
                    buffer._ResolveUri(settings.FileReader);
                }

                foreach (var image in root._images)
                {
                    image._ResolveUri(settings.FileReader);
                }

                return(root);
            }
        }
        private static (MODEL Model, Validation.ValidationResult Validation) _Read(TextReader textReader, ReadSettings settings)
        {
            Guard.NotNull(textReader, nameof(textReader));
            Guard.NotNull(settings, nameof(settings));

            using (var reader = new JsonTextReader(textReader))
            {
                var root     = new MODEL();
                var vcontext = new Validation.ValidationResult(root);

                if (!reader.Read())
                {
                    vcontext.AddError(new Validation.ModelException(root, "Json is empty"));
                    return(null, vcontext);
                }

                try
                {
                    root.Deserialize(reader);
                }
                catch (JsonReaderException rex)
                {
                    vcontext.AddError(new Validation.SchemaException(root, rex));
                    return(null, vcontext);
                }

                // schema validation

                root.ValidateReferences(vcontext.GetContext(root));
                var ex = vcontext.Errors.FirstOrDefault();
                if (ex != null)
                {
                    return(null, vcontext);
                }

                // resolve external references

                foreach (var buffer in root._buffers)
                {
                    buffer._ResolveUri(settings.FileReader);
                }

                foreach (var image in root._images)
                {
                    image._ResolveUri(settings.FileReader);
                }

                // full validation

                if (!settings.SkipValidation)
                {
                    root.Validate(vcontext.GetContext(root));
                    ex = vcontext.Errors.FirstOrDefault();
                    if (ex != null)
                    {
                        return(null, vcontext);
                    }
                }

                return(root, vcontext);
            }
        }