I receive an int from rest API I want json deserializer to put into string property "Hovednummer", but I receive an error saying can't convert from int to string.
I tried to fix this with a custom converter class I call IntToStringConverter. And I add a Json property to the property Hovednummer [JsonConverter(typeof(IntToStringConverter))].
But it doesn't work, when I debug the program it doesn't even enter any breakpoint in the custom converter class.
namespace CrownData.DataInteractionLayer.DanishCrown.Models
{
public class StemDataReadDTO
{
[JsonConverter(typeof(IntToStringConverter))]
public string Hovednummer { get; set; }
public EjerStem Ejer { get; set; }
}
public class IntToStringConverter : Newtonsoft.Json.JsonConverter
{
public override bool CanConvert(Type typeToConvert)
{
return typeToConvert == typeof(string);
}
public override bool Equals(object obj)
{
return base.Equals(obj);
}
public override int GetHashCode()
{
return base.GetHashCode();
}
public object IntToString(JsonReader reader) //, Type objectType, object existingValue, JsonSerializer serializer
{
if (reader.TokenType == JsonToken.Null)
return null;
if (reader.TokenType == JsonToken.String)
return reader.Value;
if (reader.TokenType == JsonToken.Integer)
return reader.Value.ToString();
throw new JsonReaderException(string.Format("Unexcepted token {0}", reader.TokenType));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override string ToString()
{
return base.ToString();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
TryGetStemData, getting data. This works, I get something. I just want the hovedenr datatype to stay string. Right now I'm forced to set it as int.
public bool TryGetStemData(string hovedNummer, string cvrNummer, out Models.StemDataReadDTO stemData) { string url = _dcConfig.UrlStemData; StemDataCreateDTO payload = new() { CVRnr = cvrNummer, Hovednr = hovedNummer }; var stemTask = GetClientDataAsPostAsync<Models.StemDataReadDTO>(url, payload); stemTask.Wait(); stemData = stemTask.Result.result; return stemTask.Result.succes; }
GetClientDataAsPostAsync method, it's a generic method used for getting and validate reponses.
private async Task<(bool succes, T result)> GetClientDataAsPostAsync<T>(string url, object payload, bool allowNull = false) { bool isValid = false; int MaxTimeout = 20; var cts = new CancellationTokenSource(TimeSpan.FromSeconds(MaxTimeout)); T result = default; try { HttpResponseMessage response = await _client.PostAsJsonAsync(url, payload, _serializerOptions, cts.Token); if (response.IsSuccessStatusCode) { result = await JsonSerializer.DeserializeAsync<T>(await response.Content.ReadAsStreamAsync()); if (result == null && !allowNull) { ErrorMessage = "Ugyldigt returdata"; } else { isValid = true; } } else { ErrorMessage = (await response.Content.ReadAsStringAsync()) ?? response.ReasonPhrase; } } catch (TaskCanceledException e) { ErrorMessage = $"Timout: {e.Message}"; } catch (Exception e) { ErrorMessage = e.Message; } return (isValid, result); }
I setting some options here, but I get the same error even with the numberHandling set to Write as string.
_serializerOptions = new JsonSerializerOptions() { PropertyNamingPolicy = null, NumberHandling = (System.Text.Json.Serialization.JsonNumberHandling.WriteAsString), };