使用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
相关产品推荐
相关产品推荐

