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

子模型Model1取值为null,如何关联BaseModel获取JSON数据?

问题分析与解决方案

核心问题点

  1. 属性访问权限不足
    你的BaseModel中model1、a1、a2都是默认私有(private)修饰符,而Json.NET(从代码实现判断使用的是Newtonsoft.Json)默认仅序列化/反序列化public成员,导致这些属性在反序列化时根本不会被赋值,本身就是null。

  2. 双向引用未建立

    • JSON中没有model1的相关数据,反序列化后BaseModel的model1属性直接为null;
    • 即便手动实例化model1,也未将当前BaseModel实例赋值给model1.Parent,导致Parent始终为null,进而b1、b2无法获取到目标值。

具体修复步骤

步骤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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 23:27:09