C#使用JSON.Net序列化时移除Product类型空items数组的问题咨询
问题原因排查(ShouldSerialize不生效)
- 首先确认你项目使用的序列化库:
ShouldSerialize{PropertyName}是 Newtonsoft.Json(Json.NET) 专属的条件序列化规则,如果你用的是.NET Core/5+ 自带的System.Text.Json序列化库,这个方法默认不会被识别,自然不会生效。 - 如果你确实使用的是Newtonsoft.Json,检查序列化配置有没有开启忽略属性的全局规则,或者有没有给
items属性加[JsonIgnore]等标记覆盖了条件序列化逻辑。 - 另外你给出的业务代码存在变量名重复问题,
foreach循环中已经声明了product变量,内部又定义了同名的Item product,会直接编译报错,需要修改变量名区分,比如改为Item item = new Item();。
方案1:修复序列化阶段的条件控制
如果你用Newtonsoft.Json,修正后即可生效
不需要改你现有的ShouldSerializeitems逻辑,只要确认序列化调用的是Newtonsoft的方法即可:
// 正确调用方式 var json = JsonConvert.SerializeObject(yourItemList, Formatting.Indented);
如果你用System.Text.Json,需要自定义转换器实现
public class ItemJsonConverter : JsonConverter<Item> { public override Item Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { return JsonSerializer.Deserialize<Item>(ref reader, options); } public override void Write(Utf8JsonWriter writer, Item value, JsonSerializerOptions options) { writer.WriteStartObject(); writer.WriteString(nameof(Item.Type), value.Type); writer.WriteNumber(nameof(Item.Order), value.Order); writer.WriteNumber(nameof(Item.id), value.id); writer.WriteString(nameof(Item.text), value.text); // 只有Type不是Product的时候才序列化items if (value.Type != "Product") { writer.WritePropertyName(nameof(Item.items)); JsonSerializer.Serialize(writer, value.items, options); } writer.WriteEndObject(); } }
调用的时候把转换器加进去:
var options = new JsonSerializerOptions { Converters = { new ItemJsonConverter() }, WriteIndented = true }; var json = JsonSerializer.Serialize(yourItemList, options);
方案2:JSON生成后移除指定属性
如果不想改序列化逻辑,可以把生成的JSON解析为JArray,遍历所有节点移除Product类型下的items属性:
using Newtonsoft.Json.Linq; // 假设rawJson是你已经生成的JSON字符串 var jArray = JArray.Parse(rawJson); // 递归遍历所有Item节点 void RemoveProductItems(JToken node) { if (node.Type == JTokenType.Object) { var obj = (JObject)node; if (obj.Value<string>("Type") == "Product") { obj.Remove("items"); } // 遍历子节点继续处理 foreach (var child in obj.Children()) { RemoveProductItems(child); } } else if (node.Type == JTokenType.Array) { foreach (var child in (JArray)node) { RemoveProductItems(child); } } } RemoveProductItems(jArray); // 处理完再转成字符串 var processedJson = jArray.ToString(Newtonsoft.Json.Formatting.Indented);
内容的提问来源于stack exchange,提问作者Kim
相关产品推荐
相关产品推荐

