CodexBloom - Programming Q&A Platform

C# - Custom JSON Converter scenarios for Nested Dictionaries with Nullable Values

πŸ‘€ Views: 238 πŸ’¬ Answers: 1 πŸ“… Created: 2025-06-11
c# json serialization system.text.json custom-converter C#

I'm confused about I'm migrating some code and I'm wondering if anyone has experience with Does anyone know how to I'm having trouble implementing a custom JSON converter for a nested dictionary structure in C#... The scenario involves a `Dictionary<string, Dictionary<string, int?>>` where the inner dictionaries can have nullable integer values. When I attempt to serialize this structure using `System.Text.Json` (version 6.0), I encounter an `InvalidOperationException` stating `The JSON value could not be converted to System.Int32` for any null entries. I have implemented a custom converter as follows: ```csharp public class NestedDictionaryConverter : JsonConverter<Dictionary<string, Dictionary<string, int?>>> { public override Dictionary<string, Dictionary<string, int?>> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { var result = new Dictionary<string, Dictionary<string, int?>>(); while (reader.Read()) { if (reader.TokenType == JsonTokenType.EndObject) break; var key = reader.GetString(); reader.Read(); // Move to inner dictionary var innerDict = JsonSerializer.Deserialize<Dictionary<string, int?>>(ref reader, options); result[key] = innerDict; } return result; } public override void Write(Utf8JsonWriter writer, Dictionary<string, Dictionary<string, int?>> value, JsonSerializerOptions options) { writer.WriteStartObject(); foreach (var kvp in value) { writer.WritePropertyName(kvp.Key); writer.WriteStartObject(); foreach (var innerKvp in kvp.Value) { writer.WritePropertyName(innerKvp.Key); if (innerKvp.Value.HasValue) { writer.WriteNumberValue(innerKvp.Value.Value); } else { writer.WriteNullValue(); } } writer.WriteEndObject(); } writer.WriteEndObject(); } } ``` When I serialize an instance of this structure, I am getting an exception when the inner dictionary contains null values. I have verified that the inner dictionary itself is being created properly, but the serialization seems to throw an behavior. I tried using `JsonSerializer.Serialize` with the options set to include null values, but it didn't resolve the scenario. Here’s how I am invoking the serialization: ```csharp var data = new Dictionary<string, Dictionary<string, int?>> { ["key1"] = new Dictionary<string, int?> { ["innerKey1"] = 1, ["innerKey2"] = null }, ["key2"] = new Dictionary<string, int?> { ["innerKey3"] = 2 } }; var options = new JsonSerializerOptions { Converters = { new NestedDictionaryConverter() }, IncludeFields = true, WriteIndented = true }; string json = JsonSerializer.Serialize(data, options); ``` The output should ideally include the null values as `null`, but I’m getting the `InvalidOperationException`. Any insights on how to properly handle nullable values in this nested dictionary scenario would be greatly appreciated. My team is using C# for this CLI tool. Could this be a known issue? Could this be a known issue? For context: I'm using C# on Windows 10. What would be the recommended way to handle this? For context: I'm using C# on Ubuntu 22.04. What's the correct way to implement this?