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



我想通过特定的"键"删除JSON属性。但它并没有像我预期的那样起作用。我的代码没有改变任何东西。

我做了以下的

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}]

所以你的代码有几个问题。首先似乎是一个bug,你在属性的foreach循环期间计数迭代,而不是在对象的循环期间。例如,你想要删除数组中每一项的属性,但属性总是在位置0。因此,对于每个循环,你总是要删除名为name的对象属性;在位置0。这可以通过将值设置为null而不是删除它来说明。您将看到您的输出中第一个对象的名称为空,但接下来的对象将保持不变。

我曾经尝试过让它按原样工作,但是我着陆的地方基本上只是一个for循环,它的功能与foreach相同,只是做了额外的工作。

。我们可以试着这样修改你的初始代码:

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++;
}

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

for (int i = 0; i < jArray.Count; i++)
{
    var jObj = jArray[i] as JObject;
    jObj.Remove("name");
}

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

foreach (JObject jObj in jArray)
{
    jObj.Remove("name");
}
编辑:我注意到顶部foreach方法抛出了一个异常,"Collection被修改;枚举操作不能执行。"我只是将值设为null,而不是移除它。但我将把答案的其余部分留作参考。

只使用JsonIgnore属性。

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

改变:

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

…:

public class Food
{
    [JsonIgnore] // <-------- This causes 'name' to be excluded from serialisation
    public string name;
    public int price;
}

…像这样使用:

var foodlist = new List<Food>()
{
    new() { name = "Banana", price = 3000 },
    new() { name = "Apple", price = 1000}
};
    
string jasonString = JsonConvert.SerializeObject(foodlist);

参见

  • JsonIgnoreAttribute , Json。净

为了信息起见,如果json中有无用的数据,请忽略它们:

{
    "name" : "banana",
    "price" : 1000
}
[Serializable]
public class Item
{
     public int price;
}
void Start()
{
    Item itemInstance = JsonUtility.FromJson<Item>(json);
}

本例中的项没有"名称"。

相关内容

  • 没有找到相关文章

最新更新