c# - Json反序列化,反序列化时无法将int解析成字符串。尝试使用自定义转换器类解决此问题
问题描述
我从 rest API 收到一个 int,我希望将 json 反序列化器放入字符串属性“Hovednummer”,但我收到一条错误消息,提示无法从 int 转换为字符串。
我尝试使用我称为 IntToStringConverter 的自定义转换器类来解决此问题。我向属性 Hovednummer [JsonConverter(typeof(IntToStringConverter))] 添加了一个 Json 属性。
但它不起作用,当我调试程序时,它甚至没有在自定义转换器类中输入任何断点。
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,获取数据。这行得通,我得到了一些东西。我只希望 hovedenr 数据类型保持字符串。现在我被迫将其设置为 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 方法,它是用于获取和验证响应的通用方法。
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); }
我在这里设置了一些选项,但即使将 numberHandling 设置为 Write as string,我也会遇到相同的错误。
_serializerOptions = new JsonSerializerOptions() { PropertyNamingPolicy = null, NumberHandling = (System.Text.Json.Serialization.JsonNumberHandling.WriteAsString), };
解决方案
推荐阅读
- php - 无法从控制器中的函数访问用户表中的数据
- ag-grid - Ag-Grid - 当 editType 为“fullRow”时,删除 customCellEditors 上的渲染延迟
- javascript - 无效的交互应用命令(discord.js 斜线命令使用 WOKCommands)
- android - Android手机应用程序如何检查手机国家设置
- flutter - 发生突变时如何通知其他屏幕重新获取?
- python - 我无法使用 Beautifulsoup python 获取 HTML 标签的值
- python - Python - 如何在其他线程处暂停?
- python-3.x - 来自 pytorch 的“torch.relu_(input) 未知参数类型”
- ios - 如何将数据推送到ios应用程序
- docker-compose - 如何在启动期间使用 docker-compose 动态包含数据库运行时