Сервер возвращает строковое значение JSON, которое является строкой URL-запроса:
{
"parameters": "key1=value1&key2=value2"
}
У меня есть свойство, настроенное для получения этого, и преобразования его в Dictionary
как часть десериализацииprocess:
Свойство с атрибутом JsonConverter
:
[JsonConverter(typeof(QueryStringToDictionaryJsonConverter))]
public Dictionary<string, string> Parameters { get; set; }
Конвертер:
public class QueryStringToDictionaryJsonConverter : JsonConverter<Dictionary<string, string>> {
public override Dictionary<string, string> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {
var queryString = reader.GetString();
if (string.IsNullOrEmpty(queryString)) return null;
return QueryHelpers.ParseQuery(queryString).ToDictionary(e => e.Key, e => string.Join(",", e.Value.ToArray()));
}
...
}
Это должно работать.
Но это даже не получаетсяв мой конвертер.
Из того, что я могу сказать, JsonSerializer.DeserializeAsync<T>(myJson)
видит, что типом свойства является Dictionary
, и поэтому он пытается разобрать значение как таковое сам по себе и завершается неудачно (результирующее исключение является «недопустимым приведением», поскольку оно пытается GetEnumerable()
и т. д.). Точка останова в моем конвертере никогда даже не получает удар.
Я могу заставить его работать, сделав свойство object
и затем приведя к Dictionary
позже, где оно используется, но это уродливое решение.
Есть ли способ заставить JsonSerializer.DeserializeAsync<T>(myJson)
просто использовать мой конвертер, не пытаясь быть умным сам по себе?
(я использую Microsoft System.Text.Json в .NETCore 3)