转换JSON-RPC到XML前移除布尔类型false字段的实现方法
解决方案:移除JSON中布尔类型false字段后转换为XML
要实现只移除布尔类型的false值字段,同时保留字符串类型的"false"值,你可以借助Newtonsoft.Json的JObject/JToken API递归遍历并清理JSON结构,步骤如下:
1. 递归清理布尔false属性
编写递归方法遍历JSON的所有节点,识别并移除值为布尔false的属性,嵌套对象和数组也会被深度处理:
using Newtonsoft.Json.Linq; using System.Collections.Generic; private static void RemoveBooleanFalseProperties(JToken token) { // 处理对象类型节点 if (token.Type == JTokenType.Object) { var propsToRemove = new List<string>(); foreach (var prop in ((JObject)token).Properties()) { // 判断当前属性值是否是布尔类型且为false if (prop.Value.Type == JTokenType.Boolean && (bool)prop.Value == false) { propsToRemove.Add(prop.Name); } else { // 递归处理子节点 RemoveBooleanFalseProperties(prop.Value); } } // 批量移除标记的属性(避免遍历中修改集合引发异常) foreach (var propName in propsToRemove) { ((JObject)token).Remove(propName); } } // 处理数组类型节点 else if (token.Type == JTokenType.Array) { foreach (var item in ((JArray)token)) { RemoveBooleanFalseProperties(item); } } }
2. 主流程处理
将原始JSON解析为JObject,调用清理方法后重新序列化为JSON,再转换为XML:
using Newtonsoft.Json; using System.Xml; // 你的原始JSON字符串 string originalJson = @" { ""street1"": ""Main St"", ""street2"": false, ""is_company"": false, ""custom_value_1"": ""false"", ""contact"": { ""name"": ""John"", ""is_active"": false, ""note"": ""false"" }, ""orders"": [ { ""id"": 1, ""is_paid"": false, ""status"": ""false"" } ] }"; // 1. 解析JSON为JObject JObject jsonObject = JObject.Parse(originalJson); // 2. 清理布尔false属性 RemoveBooleanFalseProperties(jsonObject); // 3. 序列化为清理后的JSON字符串 string cleanedJson = jsonObject.ToString(Formatting.None); // 4. 转换为XML文档 XmlDocument xmlDoc = JsonConvert.DeserializeXmlNode(cleanedJson);
逻辑说明
- 该方法只会匹配
JTokenType.Boolean类型且值为false的属性,字符串类型的"false"(JTokenType.String)会被完整保留。 - 递归处理支持嵌套的对象和数组结构,确保所有层级的布尔false属性都被移除。
- 批量移除属性是为了避免在遍历JObject属性时直接修改集合,引发枚举异常。
内容的提问来源于stack exchange,提问作者Alwin N
相关产品推荐
相关产品推荐

