首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何从对象数组中删除具有特定名称的JSON属性?

如何从对象数组中删除具有特定名称的JSON属性?
EN

Stack Overflow用户
提问于 2022-11-07 18:58:01
回答 2查看 57关注 0票数 0

我希望通过一个特定的“键”来删除JSON属性,但是它并不像我预期的那样工作。我的代码一点也没变。

我做了以下工作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void Start()
{
    var foodlist = new List<Food>()
    {
        new() { name = "Banana", price = 3000 },
        new() { name = "Apple", price = 1000}
    };
    
    // SerializeObject()
    string jasonString = JsonConvert.SerializeObject(foodlist);
    JArray jArray = JArray.Parse(jasonString);

    // Jarray => String  Serialize
    string jarrayString2 = JsonConvert.SerializeObject(jArray);

    foreach (var jObject in jArray.Children<JObject>())
    {
        int indexNum = 0;
        foreach (var jProperty in jObject.Properties())
        {
            if(jProperty.Name == "name")
            {
                jArray.Remove(jArray[indexNum][jProperty.Name]);
                indexNum++;
            }
        }
    }

    // Check
    string jarrayString = JsonConvert.SerializeObject(jArray);
    print(jarrayString);
}

public class Food
{
    public string name;
    public int price;
}

**结果没有改变**输出[{"name":"Banana","price":3000},{"name":"Apple","price":1000}]

结果我想要[{"price":3000},{"price":1000}]

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-07 19:28:17

所以你的代码有几个问题。首先,最重要的似乎是一个bug,在属性的foreach循环期间,而不是在对象循环期间,您正在计算迭代。也就是说,您希望删除数组中每个项的属性,但属性始终位于0位置。因此,对于每个循环,总是在0位置移除名为"name“的对象属性。这可以通过将值设置为null来说明,而不是删除它。您将看到输出的第一个对象名为null,但以下对象将保持不变。

我曾经尝试过让它按原样工作,但是我已经登陆的地方基本上只是一个for循环,它的工作和foreach一样,需要额外的工作。

例如,我们可以尝试以这样的方式修复初始代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int indexNum = 0;
foreach (var jObject in jArray.Children<JObject>())
{        
    foreach (var jProperty in jObject.Properties())
    {            
        if(jProperty.Name == "name")
        {
            jArray[indexNum][jProperty.Name] = null;
        }
    }
    indexNum++;
}

这应该针对每个对象中的正确属性,但实际上可以简化为如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for (int i = 0; i < jArray.Count; i++)
{
    var jObj = jArray[i] as JObject;
    jObj.Remove("name");
}

然后进一步简化,我们可以在一个简单的foreach中这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
foreach (JObject jObj in jArray)
{
    jObj.Remove("name");
}

编辑:我注意到顶级foreach方法抛出了一个异常,即"Collection被修改了;枚举操作可能不会执行“。因此,我只是将值设置为null,而不是尝试删除它。但我将把剩下的答案留给大家参考。

票数 0
EN

Stack Overflow用户

发布于 2022-11-08 00:02:26

只需使用JsonIgnore属性即可。

指示JsonSerializer 而不是序列化公共字段或公共读/写属性值。更多...

更改:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Food
{
    public string name;
    public int price;
}

...to:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Food
{
    [JsonIgnore] // <-------- This causes 'name' to be excluded from serialisation
    public string name;

    public int price;
}

...and的用法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var foodlist = new List<Food>()
{
    new() { name = "Banana", price = 3000 },
    new() { name = "Apple", price = 1000}
};
    
string jasonString = JsonConvert.SerializeObject(foodlist);

另请参阅

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74355230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文