-
Notifications
You must be signed in to change notification settings - Fork 5.4k
Open
Labels
area-System.Text.JsonenhancementProduct code improvement that does NOT require public API changes/additionsProduct code improvement that does NOT require public API changes/additionshelp wanted[up-for-grabs] Good issue for external contributors[up-for-grabs] Good issue for external contributors
Milestone
Description
Description
while deserialize Dictionary<string, int> with a custom StringJsonConverter which is used to convert null to empty string , it throws:
Unhandled exception. System.NotSupportedException: The type 'System.String' is not a supported dictionary key using converter of type 'StringJsonConverter'. Path: $.Pages['Chapter 1'] | LineNumber: 4 | BytePositionInLine: 20.
---> System.NotSupportedException: The type 'System.String' is not a supported dictionary key using converter of type 'StringJsonConverter'.
if i remove StringJsonConverter, it works fine.
the environment is
.NET SDK:
Version: 8.0.404
Commit: 7b190310f2
Workload version: 8.0.400-manifests.996cfe54
MSBuild version: 17.11.9+a69bbaaf5
OS Name: Windows
OS Version: 10.0.19044
OS Platform: Windows
RID: win-x64
Base Path: C:\Program Files\dotnet\sdk\8.0.404\
the full code is here:
using System.Text.Json;
using System.Text.Json.Serialization;
var options = new JsonSerializerOptions() { TypeInfoResolver = MyJsonSerializerContext.Default };
// everything works fine if I remove the line below
options.Converters.Add(new StringJsonConverter());
var book = JsonSerializer.Deserialize<Book>(
"""
{
"Title": "Philosopher's Stone",
"Author": "J.K.Rowling",
"Pages": {
"Chapter 1": 10,
"Chapter 2": 20
}
}
""", options);
Console.WriteLine(book!.Pages["Chapter 1"]);
public class Book
{
public string Title { get; set; } = "";
public string Author { get; set; } = "";
public Dictionary<string, int> Pages { get; set; } = new Dictionary<string, int>();
}
/// <summary>
/// read and write null string as empty string
/// </summary>
public class StringJsonConverter : JsonConverter<string>
{
public override bool HandleNull => true;
public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
var s = reader.GetString();
return s == null ? string.Empty : s.Trim();
}
public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options)
{
writer.WriteStringValue(string.IsNullOrEmpty(value) ? string.Empty : value);
}
}
[JsonSerializable(typeof(Book))]
public partial class MyJsonSerializerContext : JsonSerializerContext;Reproduction Steps
- create an empty console app
- copy the code to the program.cs
- run
Expected behavior
no exception throws
Actual behavior
throws System.NotSupportedException
Regression?
No response
Known Workarounds
No response
Configuration
No response
Other information
No response
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
area-System.Text.JsonenhancementProduct code improvement that does NOT require public API changes/additionsProduct code improvement that does NOT require public API changes/additionshelp wanted[up-for-grabs] Good issue for external contributors[up-for-grabs] Good issue for external contributors