Десериализация JSON с дублирующими полями
Есть проблема. При чтении JSON сериализатором system.text.json, у которого дублируются название полей не происходит ошибка. Необходимо при таких случаях вызывать исключения. Сериализатор на класс не повесить, поскольку таких классов в проекте 100500, а во вторых некоторые классы уже имеют свои сериализаторы.
{
"A":1,
"B":2,
"C":3,
"A":4,
"B":5
}
к примеру это должно выдавать исключение
System.Text.Json.JsonSerializer.Deserialize<Dictionary<string, string>>("{\"a\":\"a\",\"a\":\"a\"}");
UPD: Удалил случайную запятую из примера
Ответы (1 шт):
Пока получилось только так. Дело в том, что если есть дубли, то строка foreach (var key in obj) выдаст исключение вида An item with the same key has already been added. Key: {0} (Parameter ‘D’). + я добавляю по какому пути. В итоге будет исключение вида An item with the same key has already been added. Key: {0} (Parameter ‘D’). In ‘$.A.B.C’
private static void CheckDuplicate(string json)
{
var nodes = new[] {System.Text.Json.Nodes.JsonNode.Parse(json)};
var checkKey = new HashSet<string>();
while (nodes.Any())
{
var nextNodes = new List<JsonNode>();
foreach (var node in nodes)
{
if (node is JsonObject obj)
{
checkKey.Clear();
try
{
foreach (var key in obj)
{
if (key.Value != null)
nextNodes.Add(key.Value);
}
}
catch(Exception ex)
{
throw new JsonException(
$"{ex.Message}. In `{obj.GetPath()}`");
}
}
else if (node is JsonArray arr)
{
nextNodes.AddRange(arr);
}
}
nodes = nextNodes.ToArray();
}
}