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

使用OnBeforeRequest修改Fiddler请求时嵌套JSON字段报错求助

问题原因分析与解决思路

常见报错原因

  • 空引用异常
    处理顶层cId时直接访问oBody.cId没问题,但嵌套的cId需要逐层访问search→con→cId。如果请求体里search或con字段不存在、为null,或者不是字典类型,直接硬访问子属性就会触发空引用报错。

  • JSON格式破坏
    修改嵌套字段后重新序列化时,可能出现语法错误(比如漏加引号、逗号,或者数据类型不匹配),导致Fiddler无法解析修改后的请求体,引发报错。

  • 代码逻辑未覆盖嵌套场景
    你的代码可能只写了处理顶层cId的逻辑,没针对嵌套结构做遍历或层级判断,强行用顶层的访问方式操作嵌套字段,导致操作失败。

修复示例代码

if (oSession.HostnameIs("abc.com") && oSession.HTTPMethodIs("POST")) {
    try {
        // 读取原始请求体并解析为JSON对象
        var rawBody = oSession.GetRequestBodyAsString();
        var jsonObj = Fiddler.WebFormats.JSON.JsonDecode(rawBody).JSONObject;

        // 处理顶层cId
        if (jsonObj.ContainsKey("cId")) {
            jsonObj["cId"] = 12345678;
        }

        // 处理嵌套的search.con.cId,逐层判断避免空引用
        if (jsonObj.TryGetValue("search", out var searchVal) && searchVal is Dictionary<string, object> searchObj) {
            if (searchObj.TryGetValue("con", out var conVal) && conVal is Dictionary<string, object> conObj) {
                if (conObj.ContainsKey("cId")) {
                    conObj["cId"] = 12345678;
                }
            }
        }

        // 重新序列化为JSON并设置回请求体
        var modifiedBody = Fiddler.WebFormats.JSON.JsonEncode(jsonObj);
        oSession.utilSetRequestBody(modifiedBody);
    } catch (Exception ex) {
        // 日志记录错误,方便排查
        FiddlerApplication.Log.LogString($"修改请求体失败: {ex.Message}");
    }
}

代码说明

  • 用TryGetValue和类型判断替代直接访问,避免空引用;
  • 加try-catch捕获异常并记录日志,方便定位具体请求的问题;
  • 严格按JSON层级处理,确保每个嵌套字段存在且类型正确后再修改。

内容的提问来源于stack exchange,提问作者user5337216

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 09:46:05