using System.Collections;
using System.Collections.Generic;
using System.Text.Json.Serialization;
using System.Text.Json.Serialization.Metadata;
using System.Text.Json.Nodes;
[JsonDerivedType(typeof(ChangeBucketDto), "changeBucketDto"), JsonDerivedType(typeof(TrackedChangeDto), "trackedChangeDto")]
[JsonPropertyName("key")]
public required string Key { get; set; }
public class ChangeBucketDto : Dto
[JsonPropertyName("text")]
public required string Text { get; set; }
[JsonPropertyName("changes")]
public required List<TrackedChangeDto> Changes { get; set; }
public class TrackedChangeDto : Dto
[JsonPropertyName("origin")]
public required ChangeOrigin Origin { get; set; }
[JsonPropertyName("oldValue")]
public JsonNode? OldValue { get; set; }
[JsonPropertyName("newValue")]
public JsonNode? NewValue { get; set; }
[JsonPropertyName("changeType")]
public required string ChangeType { get; set; }
[JsonPropertyName("displayOrder")]
public required List<string> DisplayOrder { get; set; }
[JsonPropertyName("lastModified")]
public required DateTime LastModified { get; set; }
[JsonPropertyName("live")]
public required bool Live { get; set; }
public class ChangeOrigin
[JsonPropertyName("ContainerName")]
public string? ContainerName { get; set; }
[JsonPropertyName("FileName")]
public string? FileName { get; set; }
public static void Test()
var inputOptions = new JsonSerializerOptions
var inputStringified = GetInputJson();
var json = JsonSerializer.Deserialize<List<ChangeBucketDto>>(inputStringified, inputOptions);
var options = new JsonSerializerOptions
var stringified = JsonSerializer.Serialize(json, options);
Console.WriteLine(stringified);
Assert.That(JsonNode.DeepEquals(JsonSerializer.Deserialize<JsonNode>(inputStringified, options), JsonNode.Parse(stringified)));
static string GetInputJson() =>
"ContainerName": "answers",
"FileName": "answers.json"
"lastModified": "2024-05-13T17:23:30.509Z",
"key": "change-highlights-Maintenance"
"ContainerName": "highlights",
"FileName": "highlights.json"
"timeStampFrom": "2023-12-13T11:50",
"timeStampTo": "2023-12-13T17:00"
"timeStampFrom": "2023-12-13T11:50",
"timeStampTo": "2023-12-13T18:00"
"lastModified": "2024-05-13T17:23:30.509Z",
"key": "change-highlights-Maintenance"
"text": "Groepsincidenten",
"key": "knowledgesources"
public static partial class JsonExtensions
public static ref Utf8JsonReader ReadAndAssert(ref this Utf8JsonReader reader) { if (!reader.Read()) { throw new JsonException(); } return ref reader; }
public static T ThrowOnNull<T>(this T? value) where T : class => value ?? throw new ArgumentNullException();
public static void Main()
Console.WriteLine("Environment version: {0} ({1}), {2}", System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription , Environment.Version, Environment.OSVersion);
Console.WriteLine("System.Text.Json version: " + typeof(JsonSerializer).Assembly.FullName);
Console.WriteLine("Failed with unhandled exception: ");