如何在ASP.NET 5 MVC中使用System.Text.Json反序列化嵌套为字符串形式的JSON对象
解决JSON中嵌套字符串形式JSON的反序列化问题
你的问题根源很明确:API返回的JSON里,data字段不是直接的JSON对象,而是被序列化后的字符串形式JSON,但你的实体类里Data属性定义的是EstoData对象类型,System.Text.Json默认无法自动把字符串转成对应的对象,所以抛出了转换失败的错误。
下面给你两种可行的解决思路:
方法一:自定义JSON转换器(推荐)
咱们可以写一个自定义的JsonConverter,让它在反序列化时自动把字符串形式的JSON解析成EstoData对象。
首先创建转换器类:
public class StringToEstoDataConverter : JsonConverter<EstoData> { public override EstoData Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { // 读取字符串形式的JSON var jsonString = reader.GetString(); // 把字符串反序列化为EstoData对象 return JsonSerializer.Deserialize<EstoData>(jsonString, options); } public override void Write(Utf8JsonWriter writer, EstoData value, JsonSerializerOptions options) { // 如果需要序列化的话,把EstoData转成字符串形式的JSON var jsonString = JsonSerializer.Serialize(value, options); writer.WriteStringValue(jsonString); } }
然后在EstoJarelMaksTulemnus类的Data属性上添加转换器特性:
public class EstoJarelMaksTulemnus { public string[] Errors { get; set; } [JsonConverter(typeof(StringToEstoDataConverter))] public EstoData Data { get; set; } public string Mac { get; set; } }
现在你原来的反序列化代码就可以正常工作了,不需要修改其他部分:
var tulemus = JsonSerializer.Deserialize<EstoJarelMaksTulemnus>(apiResponse, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
方法二:先反序列化到临时类,再手动解析
如果不想写自定义转换器,也可以先把JSON反序列化到一个临时类,其中data字段定义为字符串,然后再手动把这个字符串解析成EstoData对象。
首先定义临时类:
public class TempEstoResponse { public string[] Errors { get; set; } public string Data { get; set; } public string Mac { get; set; } }
然后分两步处理:
// 第一步:反序列化到临时类 var tempResponse = JsonSerializer.Deserialize<TempEstoResponse>(apiResponse, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); // 第二步:解析data字符串为EstoData对象,再组装成目标类 var tulemus = new EstoJarelMaksTulemnus { Errors = tempResponse.Errors, Data = JsonSerializer.Deserialize<EstoData>(tempResponse.Data, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }), Mac = tempResponse.Mac };
两种方法都能解决你的问题,第一种自定义转换器的方式更优雅,适合后续重复使用;第二种更直观,适合临时场景。
内容的提问来源于stack exchange,提问作者Andrus
相关产品推荐
相关产品推荐

