Загрузите глубокую вложенную схему с помощью JSchemaC#

Место общения программистов C#
Ответить
Anonymous
 Загрузите глубокую вложенную схему с помощью JSchema

Сообщение Anonymous »

У меня есть огромная схема JSON, часть которой выглядит следующим образом:

Код: Выделить всё

{
"allOf": [
{
"if": {...},
"then": {...},
"else": {
"if": {...},
"then": {...},
"else": {
"if": {...},
"then": {...},
"else": {
... and so on
}
}
}
}
]
}
Я хочу вызвать для него JSchema.Load(). Проблема в том, что глубина этого JSON превышает значение по умолчанию MaxDepth = 64, и метод Load() выдает Newtonsoft.Json.JsonReaderExceptio. Мой код выглядит так:

Код: Выделить всё

using (var stringReader = new StringReader(json))
using (var jsonReader = new JsonTextReader(stringReader))
{
var schema = JSchema.Load(jsonReader);
}
Я пытался установить для JsonTextReader.MaxDepth значение 256, но затем получаю исключение StackOverflowException.
Я написал собственную реализацию JsonTextReader, которая не должна углубляться после достижения maxDepth:

Код: Выделить всё

class DepthLimitingJsonReader : JsonTextReader
{
private readonly int _maxDepth;
private int _currentDepth;

public DepthLimitingJsonReader(TextReader reader, int maxDepth)
: base(reader)
{
_maxDepth = maxDepth;
_currentDepth = 0;
}

public override bool Read()
{
bool result = base.Read();

if (result)
{
if (TokenType == JsonToken.StartObject || TokenType == JsonToken.StartArray)
{
_currentDepth++;
// If depth exceeds maxDepth, skip the content inside this object or array
if (_currentDepth > _maxDepth && Path.EndsWith("else"))
{
Skip();
}
}
else if (TokenType == JsonToken.EndObject || TokenType == JsonToken.EndArray)
{
_currentDepth--;
}
}

return result;
}
}
Но в любом случае метод Skip() обрабатывает токены глубоко внутри структуры, и по-прежнему выдаются исключения. Я хочу игнорировать все, что глубже maxDepth. Как мне это сделать?

Подробнее здесь: https://stackoverflow.com/questions/792 ... ng-jschema
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»