Skip to content

Deserializing IReadOnlyDictionary with integer key throws InvalidCastException #45634

Description

@Liversage

System.Text.Json 5.0.0 supports dictionaries with integer keys:

{
    "1": "foo"
}

This can be deserialized to a dictionary (not read-only) with int keys:

var dictionary = JsonSerializer.Deserialize<Dictionary<int, string>>(json);

There is also support for IReadOnlyDictionary<TKey, TValue> when TKey is string:

var dictionary = JsonSerializer.Deserialize<IReadOnlyDictionary<string, string>>(json);

However, when I try to deseriailze IReadOnlyDictionary<TKey, TValue> when TKey is int I get an InvalidCastException:

Unable to cast object of type 'System.Collections.Generic.Dictionary`2[System.String,System.String]' to type 'System.Collections.Generic.Dictionary`2[System.Int32,System.String]'.
   at System.Text.Json.Serialization.Converters.IReadOnlyDictionaryOfTKeyTValueConverter`3.Add(TKey key, TValue& value, JsonSerializerOptions options, ReadStack& state)
   at System.Text.Json.Serialization.Converters.DictionaryDefaultConverter`3.OnTryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, TCollection& value)
   at System.Text.Json.Serialization.JsonConverter`1.TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value)
   at System.Text.Json.Serialization.JsonConverter`1.ReadCore(Utf8JsonReader& reader, JsonSerializerOptions options, ReadStack& state)
   at System.Text.Json.JsonSerializer.ReadCore[TValue](JsonConverter jsonConverter, Utf8JsonReader& reader, JsonSerializerOptions options, ReadStack& state)
   at System.Text.Json.JsonSerializer.ReadCore[TValue](Utf8JsonReader& reader, Type returnType, JsonSerializerOptions options)
   at System.Text.Json.JsonSerializer.Deserialize[TValue](String json, Type returnType, JsonSerializerOptions options)
   at System.Text.Json.JsonSerializer.Deserialize[TValue](String json, JsonSerializerOptions options)

I find it surprising the both dictionaries with int keys and IReadOnlyDictionary are supported but not when you combine them. If there is no intention to support the combination then a better exception type should be used to signal that instead of InvalidCastException.

Deserializing IDictionary<TKey, TValue> with int key suffers from the same problem.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions