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
相关产品推荐
相关产品推荐

