C# 如果要删除某些元素,如何迭代JObject?

C# 如果要删除某些元素,如何迭代JObject?,c#,json,collections,json.net,C#,Json,Collections,Json.net,总结: 在美国教育部API的帮助下,我计划创建一份大学名单以及计算机科学毕业生的工资中位数。但是,许多学校都有空值,试图删除空值会破坏代码,因为在枚举集合时无法修改集合 我的去核器代码: 静态JObject去核器(JObject inputJson) { //结果[]部分中的每个学校 foreach(输入JSON[“结果”]中的var学校) { //cip_4位部分中的每个学位 foreach(学校var学位[“最新课程cip四位数]) { if(string.IsNullOrEmpty(deg

总结:

在美国教育部API的帮助下,我计划创建一份大学名单以及计算机科学毕业生的工资中位数。但是,许多学校都有空值,试图删除空值会破坏代码,因为在枚举集合时无法修改集合

我的去核器代码:

静态JObject去核器(JObject inputJson)
{
//结果[]部分中的每个学校
foreach(输入JSON[“结果”]中的var学校)
{
//cip_4位部分中的每个学位
foreach(学校var学位[“最新课程cip四位数])
{
if(string.IsNullOrEmpty(degree[“earnings.media_earnings”].Value())
{
度。移除();
}
}
}
返回inputJson;
}
JSON缩写版本:

{
    "metadata": 
    {
        "total": 1444,
        "page": 14,
        "per_page": 100
    },

    "results": 
    [
        {
            "school.name": "Georgia College & State University",
            "latest.programs.cip_4_digit": 
            [
                {
                  "earnings.median_earnings": 53200,
                  "title": "Computer Science.",
                  "code": "1107"
                }
            ]
        },
        {
            "school.name": "Georgia Southern University",
            "latest.programs.cip_4_digit": 
            [
                {
                  "earnings.median_earnings": null,
                  "title": "Computer Science.",
                  "code": "1107"
                }
            ]
        }
    ]
}
Newtonsoft JSON.NET类引用:


您可以将要删除的节点添加到其他集合中,然后删除它们。比如说,

static JObject DeNullifier(JObject inputJson)
{
    var nodesToRemove = new List<JToken>();
    //Each school in the results[] section
    foreach(var school in inputJson["results"])
    {
        //Each degree in the cip_4_digit section
        foreach(var degree in school["latest.programs.cip_4_digit"])
        {
            if(string.IsNullOrEmpty(degree["earnings.median_earnings"].Value<string>()))
            {
                nodesToRemove.Add(degree);
            }
        }
    }

    foreach(var node in nodesToRemove)
    {
        node.Remove();
    }
    return inputJson;
}
静态JObject去核器(JObject inputJson)
{
var nodesToRemove=新列表();
//结果[]部分中的每个学校
foreach(输入JSON[“结果”]中的var学校)
{
//cip_4位部分中的每个学位
foreach(学校var学位[“最新课程cip四位数])
{
if(string.IsNullOrEmpty(degree[“earnings.media_earnings”].Value())
{
nodesToRemove.Add(度);
}
}
}
foreach(nodesToRemove中的var节点)
{
node.Remove();
}
返回inputJson;
}

您可以通过将您的代码与标准
Linq
中的
Where
方法相结合来实现它(无需复制源代码集)

静态JObject去核器(JObject inputJson)
{
foreach(输入JSON[“结果”]中的var学校)
{
var degrees=(JArray)学校[“最新的.programs.cip_4位];
var nullDegrees=degrees.Where(t=>t[“收益.中位数收益”].Type==JTokenType.Null).ToList();
foreach(在nullDegrees中的var nullDegree)
度。移除(零度);
}
返回inputJson;
}
您只需选择所有
latest.programs.cip_4_digit
节点,其中
earnings.media_earnings
值为空,然后从数组中删除这些项


ToList()
将带空值的令牌提升到新集合中,并有助于在删除过程中避免
invalidoOperationException

您是否尝试使用该对象的副本我可以创建该对象的副本,但删除副本不会对原始对象产生任何影响。实际上,您刚刚给了我一个想法。创建一个新的JObject,然后向其中添加有效元素。唯一的缺点是效率低下,但我将尝试使用这种方法。无论如何,您都在迭代整个json,并且无法从正在迭代的jobject中删除。您可以将此项用作骨架并从副本项中删除创建副本也可以