子模型Model1取值为null,如何关联BaseModel获取JSON数据?
问题分析与解决方案
核心问题点
属性访问权限不足
你的BaseModel中model1、a1、a2都是默认私有(private)修饰符,而Json.NET(从代码实现判断使用的是Newtonsoft.Json)默认仅序列化/反序列化public成员,导致这些属性在反序列化时根本不会被赋值,本身就是null。双向引用未建立
- JSON中没有
model1的相关数据,反序列化后BaseModel的model1属性直接为null; - 即便手动实例化
model1,也未将当前BaseModel实例赋值给model1.Parent,导致Parent始终为null,进而b1、b2无法获取到目标值。
- JSON中没有
具体修复步骤
步骤1:修正属性访问修饰符
将BaseModel的所有需要反序列化的属性改为public,确保Json.NET能正确处理:
public class BaseModel { public Model1 model1 { get; set; } public List<string> a1 { get; set; } public string a2 { get; set; } }
步骤2:建立BaseModel与Model1的双向关联
有两种实现方式可选:
方式一:手动赋值(简单直接)
在反序列化完成后,手动实例化model1并绑定Parent:
dynamic validData = DataProvider.GetTestData(); BaseModel m = validData?.ToObject<BaseModel>(); // 关联父模型 m.model1 = new Model1 { Parent = m }; // 此时访问m.model1.b1、m.model1.b2即可获取对应值
方式二:序列化回调自动绑定(更优雅)
利用Json.NET的OnDeserialized回调,在反序列化完成后自动建立关联:
using Newtonsoft.Json; using System.Runtime.Serialization; public class BaseModel { public Model1 model1 { get; set; } public List<string> a1 { get; set; } public string a2 { get; set; } [OnDeserialized] internal void OnDeserializedCallback(StreamingContext context) { if (model1 != null) { // 若JSON中包含model1数据,直接绑定Parent model1.Parent = this; } else { // 若JSON中无model1数据,自动实例化并绑定 model1 = new Model1 { Parent = this }; } } }
额外说明
如果需要从JSON中加载Model1的b3属性值,需调整JSON结构,添加model1节点:
{ "a2": "abc.abc", "id": "123", "a1": [ "/str1", "/str2", "/str3" ], "model1": { "b3": 456 } }
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

