Handling Null And Empty Strings With System.Text.Json - Part 2
[C#, System.Text.Json]
In a previous post I talked about Handling Null And Empty Strings With System.Text.Json
Today Malthe wrote asking about how to tackle the problem in the reverse - your JSON has empty strings and you want to convert them to NULL
.
Is this possible?
The answer is absolutely!
Let us use a simple model:
// Tell the compiler we will handle nulls should they occur on our own
#nullable enable
// Define our class
public class Animal
{
// The animal name may be null
public string? Name { get; set; }
// The number of legs cannot be null
public int Legs { get; set; }
}
Let us then explicitly provide our raw JSON
var rawJson = """
{
"Name": "",
"Legs": 4
}
""";
First, let us use the default serialization to see what will happen:
var retrievedMonkey = JsonSerializer.Deserialize<Animal>(rawJson);
If we run this and inspect in the debugger, the class looks like this:
This is not what we want.
We want that empty string to be deserialized as a NULL
.
The way to achieve this, as it was for the serialization, is to write a JsonConverter for the string type, and to override the Read
method.
So we write the following code, completing the serializer we had defined earlier:
public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
// Read the string
var res = reader.GetString();
// If it is am empty string, return a null
if (string.IsNullOrEmpty(res))
return null;
else
// otherwise, return the read value
return res;
}
Our final class, including the code for serialization, now looks like this:
public class NullToEmptyStringConverter : JsonConverter<string>
{
// Override default null handling
public override bool HandleNull => true;
// Check the type
public override bool CanConvert(Type typeToConvert)
{
return typeToConvert == typeof(string);
}
public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
// Read the string
var res = reader.GetString();
// If it is am empty string, return a null
if (res == "")
return null;
else
// otherwise, return the read value
return res;
}
public override void Write(Utf8JsonWriter writer, string? value, JsonSerializerOptions options)
{
if (value == null)
writer.WriteStringValue("");
else
writer.WriteStringValue(value);
}
}
We finally create an JsonSerializationOptions object to tell the serializer to use our custom converter.
// create the options
var options = new JsonSerializerOptions()
{
WriteIndented = true
};
// register the converter
options.Converters.Add(new NullToEmptyStringConverter());
retrievedMonkey = JsonSerializer.Deserialize<Animal>(rawJson, options);
If we run the code we see now that the name is correctly set to NULL
The code is in my Github.
Happy hacking!