You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 17:12:44