You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何动态修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 16:18:02