ReferenceHandler
Без ReferenceHandler цикл
node.Next = node даёт JsonException.
ReferenceHandler.IgnoreCycles
записывает повтор как null.
Проверяют подстроку ""Next":null"
в результате
Serialize.
Синтаксис
options.ReferenceHandler = ReferenceHandler.IgnoreCycles;
Пример
Давайте поймаем цикл без обработчика:
using System;
using System.Text.Json;
class Node
{
public Node Next { get; set; }
}
class Program
{
static void Main()
{
Node node = new Node();
node.Next = node;
try
{
JsonSerializer.Serialize(node);
}
catch (JsonException)
{
Console.WriteLine("fail");
}
}
}
Результат выполнения кода:
"fail"
Пример
Давайте сериализовать с IgnoreCycles:
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
class Node
{
public Node Next { get; set; }
}
class Program
{
static void Main()
{
var options = new JsonSerializerOptions
{
ReferenceHandler = ReferenceHandler.IgnoreCycles
};
Node node = new Node();
node.Next = node;
string res = JsonSerializer.Serialize(node, options);
Console.WriteLine(res.Contains("\"Next\":null"));
}
}
Результат выполнения кода:
True
Пример
Давайте убедимся, что следующий узел записан объектом:
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
class Node
{
public Node Next { get; set; }
}
class Program
{
static void Main()
{
var options = new JsonSerializerOptions
{
ReferenceHandler = ReferenceHandler.IgnoreCycles
};
Node first = new Node();
Node second = new Node();
first.Next = second;
string res = JsonSerializer.Serialize(first, options);
bool nested = res.Contains("\"Next\":{");
Console.WriteLine(nested);
}
}
Результат выполнения кода:
True
Смотрите также
-
MaxDepth,
предел вложенности -
Serialize,
запись объектов -
JsonSerializerOptions,
объект настроек -
JsonSerializer,
класс сериализатора