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

JsonSerializer反序列化时PersonaId属性赋值异常问题排查与修复

问题原因与修复方案

原因分析

问题出在PersonaId属性的setter逻辑上:当ObjPersona为null时,你强制将PersonaId设为0,而非保留反序列化传入的原始值。

在System.Text.Json的反序列化流程中,序列化器会按属性定义的默认顺序逐个赋值。如果JSON仅包含PersonaId、未携带ObjPersona,或者ObjPersona的赋值顺序晚于PersonaId,那么在给PersonaId赋值时,ObjPersona仍处于null状态,触发setter里的错误逻辑直接把值覆盖为0,导致JSON中的1391被丢弃。

典型的错误实现示例:

public class TrabajadorViewModel
{
    private Persona _objPersona;
    private int _personaId;

    public int PersonaId
    {
        get => _objPersona?.Id ?? _personaId;
        set
        {
            // 错误逻辑:ObjPersona为null时直接设为0,忽略传入的value
            if (_objPersona == null)
                _personaId = 0;
            else
                _objPersona.Id = value;
        }
    }

    public Persona ObjPersona
    {
        get => _objPersona;
        set
        {
            _objPersona = value;
            if (_objPersona != null)
                _personaId = _objPersona.Id;
        }
    }
}

修复方案

根据业务需求,可选择以下几种修复方式:

1. 修正PersonaId的setter逻辑(最直接)

如果PersonaId在ObjPersona为null时需要保留传入的值,把setter里的硬编码0改成传入的value:

public int PersonaId
{
    get => _objPersona?.Id ?? _personaId;
    set
    {
        if (_objPersona == null)
            _personaId = value; // 保留传入的原始值
        else
            _objPersona.Id = value;
    }
}

2. 调整属性反序列化顺序

如果PersonaId的取值依赖ObjPersona,可以强制让序列化器先赋值ObjPersona,再处理PersonaId。使用[JsonPropertyOrder]标记指定顺序:

public class TrabajadorViewModel
{
    [JsonPropertyOrder(1)] // 先反序列化该属性
    public Persona ObjPersona { get; set; }

    [JsonPropertyOrder(2)] // 后反序列化该属性
    public int PersonaId 
    {
        get => _objPersona?.Id ?? 0;
        set
        {
            if (_objPersona != null)
                _objPersona.Id = value;
        }
    }
}

这样反序列化时ObjPersona先被赋值,PersonaId的setter就不会因为ObjPersona为null而触发错误逻辑。

3. 将PersonaId设为只读属性(如果不需要单独赋值)

如果PersonaId只是ObjPersona.Id的快捷访问属性,不需要从JSON单独赋值,可以把它改成只读属性,仅从ObjPersona获取值:

public class TrabajadorViewModel
{
    public Persona ObjPersona { get; set; }

    // 只读属性,无需setter
    public int PersonaId => ObjPersona?.Id ?? 0;
}

此时反序列化时只需确保JSON里的ObjPersona包含正确的Id值,PersonaId会自动获取对应的值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 18:40:03