我希望通过一个特定的“键”来删除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}]
发布于 2022-11-07 19:28:17
所以你的代码有几个问题。首先,最重要的似乎是一个bug,在属性的foreach
循环期间,而不是在对象循环期间,您正在计算迭代。也就是说,您希望删除数组中每个项的属性,但属性始终位于0位置。因此,对于每个循环,总是在0位置移除名为"name“的对象属性。这可以通过将值设置为null
来说明,而不是删除它。您将看到输出的第一个对象名为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,而不是尝试删除它。但我将把剩下的答案留给大家参考。
发布于 2022-11-08 00:02:26
只需使用JsonIgnore
属性即可。
指示JsonSerializer 而不是序列化公共字段或公共读/写属性值。更多...
更改:
public class Food
{
public string name;
public int price;
}
...to:
public class Food
{
[JsonIgnore] // <-------- This causes 'name' to be excluded from serialisation
public string name;
public int price;
}
...and的用法如下:
var foodlist = new List<Food>()
{
new() { name = "Banana", price = 3000 },
new() { name = "Apple", price = 1000}
};
string jasonString = JsonConvert.SerializeObject(foodlist);
另请参阅
https://stackoverflow.com/questions/74355230
复制相似问题