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

C#中Newtonsoft/JSON.Net无法正确反序列化JSON数组至列表

问题原因与解决方案

你的问题出在类中列表字段的访问权限和Newtonsoft.Json的序列化规则上:

Newtonsoft.Json默认只会反序列化公共(public)的字段或属性,而你定义的essential、required、forbidden都是默认私有(private)的字段,所以JSON里的对应数据无法被映射到这些字段中,导致列表为空。

修复方案(两种可选)

方案1:将字段改为公共访问权限

直接给列表字段加上public修饰符,让Newtonsoft可以访问到它们:

public class MaterialTemplate : INamed
{
    public string name = "defaultMTemplate";
    // 添加public修饰符
    public List<string> essential = new List<string>();
    public List<string> required = new List<string>();
    public List<string> forbidden = new List<string>();

    // 其余方法保持不变
    public List<MaterialData> FindMaterials()
    {
        return DataController.SearchByTag<MaterialData>(essential, required, forbidden);
    }

    public string OutputData()
    {
        string output = $"Name: {name}; ";
        output += "Required: ";
        foreach(string tag in required)
        {
            output += tag + ";";
        }
        output += " Essential: ";
        foreach (string tag in essential)
        {
            output += tag + ";";
        }
        output += " Forbidden: ";
        foreach (string tag in forbidden)
        {
            output += tag + ";";
        }
        return output;
    }

    public string GetName()
    {
        return name;
    }
}

方案2:封装为公共属性(推荐,符合C#编码规范)

将字段封装成带get/set的公共属性,这是更规范的C#写法,也能被Newtonsoft正常处理:

public class MaterialTemplate : INamed
{
    public string name = "defaultMTemplate";
    // 封装为公共属性
    public List<string> essential { get; set; } = new List<string>();
    public List<string> required { get; set; } = new List<string>();
    public List<string> forbidden { get; set; } = new List<string>();

    // 其余方法保持不变
    public List<MaterialData> FindMaterials()
    {
        return DataController.SearchByTag<MaterialData>(essential, required, forbidden);
    }

    public string OutputData()
    {
        string output = $"Name: {name}; ";
        output += "Required: ";
        foreach(string tag in required)
        {
            output += tag + ";";
        }
        output += " Essential: ";
        foreach (string tag in essential)
        {
            output += tag + ";";
        }
        output += " Forbidden: ";
        foreach (string tag in forbidden)
        {
            output += tag + ";";
        }
        return output;
    }

    public string GetName()
    {
        return name;
    }
}

验证

修改后,重新执行反序列化操作,调用OutputData()就能得到预期结果:
Name: normalFloor; Required: wood;tile;carpet; Essential: floor; Forbidden:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 23:44:57