private JSchema ResolvedSchema(Uri schemaId, Uri resolvedSchemaId) { ResolveSchemaContext context = new ResolveSchemaContext { ResolverBaseUri = _baseUri, SchemaId = schemaId, ResolvedSchemaId = resolvedSchemaId }; SchemaReference schemaReference = _resolver.ResolveSchemaReference(context); if (schemaReference.BaseUri == _baseUri) { // reference is to inside the current schema // use normal schema resolution return(null); } if (Cache.ContainsKey(schemaReference.BaseUri)) { // base URI has already been resolved // use previously retrieved schema JSchema cachedSchema = Cache[schemaReference.BaseUri]; return(_resolver.GetSubschema(schemaReference, cachedSchema)); } Stream schemaData = _resolver.GetSchemaResource(context, schemaReference); if (schemaData == null) { // resolver returned no data return(null); } JSchemaReaderSettings settings = new JSchemaReaderSettings { BaseUri = schemaReference.BaseUri, Resolver = _resolver }; JSchemaReader schemaReader = new JSchemaReader(settings); schemaReader.Cache = Cache; JSchema rootSchema; using (StreamReader streamReader = new StreamReader(schemaData)) using (JsonTextReader jsonReader = new JsonTextReader(streamReader)) { rootSchema = schemaReader.ReadRoot(jsonReader, false); } Cache[schemaReference.BaseUri] = rootSchema; // resolve defered schemas after it has been cached to avoid // stackoverflow on circular references schemaReader.ResolveDeferedSchemas(); return(_resolver.GetSubschema(schemaReference, rootSchema)); }