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

System.Text.Json无法将对象正确反序列化为字符串的原因

问题:System.Text.Json反序列化object类型属性异常,Newtonsoft.Json却正常

代码片段

if (response.StatusCode == HttpStatusCode.Conflict)
{
    var error = JsonSerializer.Deserialize<ApiResult>(content, new JsonSerializerOptions(JsonSerializerDefaults.Web));

    var metaData = error.Error.MetaData;    // 问题出在这里

    if (error.Error.ErrorCode == 35)
        OrderThrowHelper.ThrowException(ExceptionCodeType.BusinessError, error.Error.Message, error.Error.MetaData);
}

错误模型类定义

public class ApiErrorResult
{
    public int ErrorCode { get; set; }

    public ServiceCodeType ServiceCode { get; set; }

    public string Message { get; set; }

    public object MetaData { get; set; }   // 注意此处
}

接口响应JSON

{
    "IsSuccess": false,
    "Error": {
         "ErrorCode": 48,
         "ServiceCode": 1,
         "Message": "Business exception occurred",
         "MetaData": "تست"
    },
    "StatusCode": 409
}

问题现象

使用System.Text.Json反序列化后,error.Error.MetaData的实际输出为:

"MetaData": 
    {
        "ValueKind": 3
    }

但改用Newtonsoft.Json时,MetaData可正常反序列化为字符串值。

原因分析

核心差异在于两者对object类型属性的处理逻辑:

  • Newtonsoft.Json会自动识别JSON中的实际值类型(如字符串、数字),并将其反序列化为对应的.NET原生类型。
  • System.Text.Json默认将object类型的目标属性反序列化为JsonElement对象,你看到的ValueKind:3是JsonElement的标识(对应字符串类型),并非实际的JSON结构,只是JsonElement的ToString()输出结果。

解决方法

有三种常用方案:

  1. 指定具体类型:如果明确MetaData的实际类型是字符串,直接将模型中的object改为string,反序列化会直接得到正确值。
  2. 手动转换JsonElement:保留object类型,反序列化后手动转换:
    var metaDataElement = error.Error.MetaData as JsonElement;
    string metaDataValue = metaDataElement.GetString();
    
  3. 自定义转换器:编写针对object类型的Json转换器,让System.Text.Json自动识别并反序列化为对应原生类型。

内容的提问来源于stack exchange,提问作者Farhad Zamani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.02 00:02:34