我想通过特定的"键"删除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);
}
本例中的项没有"名称"。