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()输出结果。
解决方法
有三种常用方案:
- 指定具体类型:如果明确
MetaData的实际类型是字符串,直接将模型中的object改为string,反序列化会直接得到正确值。 - 手动转换JsonElement:保留
object类型,反序列化后手动转换:var metaDataElement = error.Error.MetaData as JsonElement; string metaDataValue = metaDataElement.GetString(); - 自定义转换器:编写针对
object类型的Json转换器,让System.Text.Json自动识别并反序列化为对应原生类型。
内容的提问来源于stack exchange,提问作者Farhad Zamani
相关产品推荐
相关产品推荐

