如何动态修改JSON所有节点值并保留原有结构返回相同对象
我想仅对JSON的值进行加密,使用代码处理后返回结构完全相同的JSON。
实现思路
直接操作Newtonsoft.Json的JToken节点即可保留原有结构,不需要手动拼接字符串:
- 递归遍历所有JSON节点,遇到
JObject就遍历所有属性 - 遇到
JArray就遍历所有元素 - 遇到叶节点(值类型、字符串、null等),符合加密条件就直接替换节点值
完整实现代码
using System; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string jsonstr = "{\"timestamp\":\"2016-04-08 11:21:25\",\"apiKey\":\"jdtest\",\"data\":{\"adultQuantity\":3,\"childQuantity\":0,\"babyQuantity\":0,\"segmentList\":[{\"departCityCode\":\"PNZ\",\"arriveCityCode\":\"SHA\",\"departDate\":\"2016-04-19\"}]},\"H\":\"value\",\"c\":null,\"v\":\"\",\"w\":\"null\"}"; JToken jToken = JToken.Parse(jsonstr); EncryptJsonValues(jToken); // 输出加密后的JSON,结构完全和原JSON一致 string encryptedJson = jToken.ToString(Formatting.Indented); Console.WriteLine(encryptedJson); } /// <summary> /// 递归加密JSON所有值节点,保留原结构 /// </summary> public static void EncryptJsonValues(JToken token) { if (token.Type == JTokenType.Object) { foreach (JProperty prop in token.Children<JProperty>()) { EncryptJsonValues(prop.Value); } } else if (token.Type == JTokenType.Array) { foreach (JToken child in token.Children()) { EncryptJsonValues(child); } } else { // 跳过不需要加密的场景:空字符串、null,和原有逻辑保持一致 if (token.Type == JTokenType.Null || (token.Type == JTokenType.String && string.IsNullOrWhiteSpace(token.ToString()))) { return; } // 替换为加密后的值 string originalValue = token.ToString(); string encryptedValue = EncryptValue(originalValue); token.Replace(encryptedValue); } } /// <summary> /// 自定义加密方法,替换为你自己的加密逻辑即可 /// </summary> public static string EncryptValue(string input) { // 这里替换为你的实际加密逻辑,比如AES加密等 // 示例仅做演示,实际使用时替换为真实加密代码即可 return Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(input)); } } }
特性说明
- 支持任意动态JSON结构,不限定嵌套层级,支持对象、数组混合嵌套的场景
- 完全保留原JSON的键名、数组顺序、节点结构,仅修改值内容
- 可灵活调整加密条件,比如需要加密空字符串只要修改判断逻辑即可
内容的提问来源于stack exchange,提问作者Emphasize Single
相关产品推荐
相关产品推荐

