Fiddler Classic5.x CustomRules.js代码中解析json结构数据,报错:
Type 'Fiddler.WebFormats.JSON.JsonDecode’ could not be found, is an assembly reference missing?
未能找到类型"Fiddler.WebFormats.JSON.JsonDecode",是否缺少程序集引用?


Fiddler 4.x 、Fiddler Everywhere 、 Fiddler SDK 可能是支持 Fiddler.WebFormats.JSON.JsonDecode() 或者 Fiddler.WebFormats.JSON.Parse(),但是新版的 Fiddler Classic 5.x 不支持Fiddler.WebFormats.JSON... 各方法的调用,是官方禁用了?
资料1:
原作者Eric 在这个帖子里回应 可以使用 .NET Framework 的内置解析器,或者自己拉取文中提及的git代码 生成dll文件引入到fiddler中使用。
资料2:
https://feedback.telerik.com/fiddler/1683387-march-update-broke-fiddler-public-api
帖子里 Fiddler原作者Eric 和 现在维护方的对话,大致意思是:
现维护方表示: Fiddler.WebFormats 的API 是第三方库实现的 有安全风险,现(5.0版本)已删除这个API,后边未确定是否要继续开放。并且现在内置的json数据解析是用 .NET JSON 实现的。
原作者Eric :对安全风险的说法表示质疑,提议维护方可以用别的方式支持Fiddler.WebFormats接口功能,并继续开放这个接口。
改用 Newtonsoft.Json.Linq 实现解析:
Fiddler 的 CustomRules.js 是基于 JScript.NET 语法(类似 JavaScript)。
Tools - Options... - Scripting - language:默认选择的是 JScript.NET,JScript.NET下 可以使用 Newtonsoft.Json.Linq 方式 。。。


使用 System.Collections 构建 .Net 数据结构、使用 System.Web.Script.Serialization 序列化.Net 对象为JSON字符串:
CustomRules.js 引入 Newtonsoft.Json.Linq 、Newtonsoft.Json.JsonSerializer 等类:
//@assembly Newtonsoft.Json
import Newtonsoft.Json;
import Newtonsoft.Json.Linq;
import Newtonsoft.Json.JsonSerializer; // 显式引入JsonSerializer类
import System.Collections;
static function OnBeforeResponse(oSession: Session) {
if (m_Hide304s && oSession.responseCode == 304) {
oSession["ui-hide"] = "true"; // 在会话列表中隐藏
}
FiddlerObject.log("---------------------------------");
parseMatchData();
FiddlerObject.log("---------------------------------\n");
FiddlerObject.log("=================================");
testParseNewObj();
FiddlerObject.log("=================================\n");
}
//serialize的使用
private static function parseMatchData() {
// 构建数据结构
var resultsTest = new System.Collections.ArrayList();
var matchInfo = new System.Collections.Hashtable(); // 使用 Hashtable 替代 JavaScript 对象
// 填充数据(使用 .NET 兼容的数据结构)
matchInfo["sportId"] = "a";
matchInfo["sportName"] = "b";
matchInfo["sportAbbr"] = "c";
matchInfo["matches"] = new System.Collections.ArrayList();
var match = new System.Collections.Hashtable();
match["matchId"] = 123;
match["teams"] = new System.Collections.ArrayList();
var team = new System.Collections.Hashtable();
team["name"] = "Team A";
team["score"] = 100;
match["teams"].Add(team);
matchInfo["matches"].Add(match);
resultsTest.Add(matchInfo);
try {
// 创建 JSON 序列化器实例
var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
// 将 .NET 对象序列化为 JSON 字符串
var jsonString = serializer.Serialize(resultsTest);
FiddlerObject.log("生成的 JSON 字符串:\n" + jsonString);
} catch (e) {
FiddlerObject.log("序列化失败: " + e.message);
}
}
// 结构化提取函数:Newtonsoft.Json.Linq json字符串 转换 对象、serialize转换为json字符串
static function testParseNewObj() {
// 创建 JSON 序列化器实例
var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
// 构建数据结构
var matchList = new System.Collections.ArrayList();
var jsonString = '{"Sport":[{"SportId":46,"SportName":"我的世界","LG":[{"LGId":41918,"LGName":"我的世界A","ParentMatch":[{"OrderNo":2250420085262301,"HasLiveOpened":true,"Match":[{"MatchNo":33730439,"Status":2,"Sppd":[{"SEL":[{"SCode":1,"SName":"{TeamA}"},{"SCode":2,"SName":"{TeamB}"}]}]}]}]}]}],"StatusCode":0,"StatusDesc":"Success"}';
FiddlerObject.log("jsonString:" + jsonString);
var data = jsonStrToObj(jsonString);
if (data["StatusDesc"] !== "Success" || data["Sport"] == undefined || data["Sport"] == []) {
FiddlerObject.log("Sport not found");
return [];
}
// 1. 遍历 Sport 层级
for (var s = 0; s < data["Sport"].Count; s++) {
var sport = data["Sport"][s];
FiddlerObject.log("Sport:" + sport);
FiddlerObject.log("SportId:" + sport["SportId"]);
// 2. 遍历 League 层级
for (var l = 0; l < sport["LG"].Count; l++) {
var league = sport["LG"][l];
FiddlerObject.log("league LGId:" + league["LGId"]);
// 3. 遍历 ParentMatch 层级
for (var p = 0; p < league["ParentMatch"].Count; p++) {
var parentMatch = league["ParentMatch"][p];
FiddlerObject.log("parentMatch OrderNo:" + parentMatch["OrderNo"]);
var matchInfo = new System.Collections.Hashtable(); // 使用 Hashtable 替代 JavaScript 对象
matchInfo["matches"] = new System.Collections.ArrayList();
//FiddlerObject.log("SportId. GetType:" + sport["SportId"].GetType());//GetType()获取到的数据类型是 Newtonsoft.Json.Linq.JValue,使用.ToString()获取值
matchInfo["sportId"] = sport["SportId"].ToString();
matchInfo["sportName"] = sport["SportName"].ToString();
matchInfo["lgId"] = league["LGId"].ToString();
matchInfo["lgName"] = league["LGName"].ToString();
matchInfo["orderNo"] = parentMatch["OrderNo"].ToString();
matchInfo["hasLiveOpened"] = parentMatch["HasLiveOpened"].ToString();
// 4. 遍历 Match 层级
for (var m = 0; m < parentMatch["Match"].Count; m++) {
var matchTmp = parentMatch["Match"][m];
FiddlerObject.log("matchTmp MatchNo:" + matchTmp["MatchNo"]);
var match = new System.Collections.Hashtable();
match["sppd"] = new System.Collections.ArrayList();
match["MatchNo"] = matchTmp["MatchNo"].ToString();
match["Status"] = matchTmp["Status"].ToString();
// 5. 提取赔率数据 // 收集赔率信息
for (var o = 0; o < matchTmp["Sppd"].Count; o++) {
var sppdTmp = matchTmp["Sppd"][o];
FiddlerObject.log("Sppd -> o:" + o);
for (var se = 0; se < sppdTmp["SEL"].Count; se++) {
var sel = sppdTmp["SEL"][se];
FiddlerObject.log("sppdTmp SName:" + sel["SName"]);
var sppd = new System.Collections.Hashtable();
sppd["sCode"] = sel["SCode"].ToString();
sppd["sName"] = sel["SName"]
.replace('{TeamA}', "A")
.replace('{TeamB}', "B");
sppd["aName"] = (sel["SName"] == "{TeamA}" ? "A" : "");
sppd["bName"] = (sel["SName"] == "{TeamB}" ? "B" : "");
match["sppd"].Add(sppd);
}
}
FiddlerObject.log("match: " + serializer.Serialize(match));
matchInfo["matches"].Add(match);
}
FiddlerObject.log("matchInfo: " + serializer.Serialize(matchInfo));
matchList.Add(matchInfo);
}
}
}
FiddlerObject.log("matchList: " + serializer.Serialize(matchList));
return matchList;
}
//Newtonsoft.Json.Linq的使用:json字符串 转换 对象
static function jsonStrToObj(jsonString) {
try {
return Newtonsoft.Json.Linq.JObject.Parse(jsonString);
} catch (e) {
FiddlerApplication.Log.LogString("json字符串转换对象异常:" + jsonString);
return null;
}
}
查看日志:
查看FiddlerApplication.Log.LogString 输出的 Fiddler 日志(右侧视图 - Log 视图),输出内容:
[{"sportAbbr":"c","sportName":"b","matches":[{"matchId":123,"teams":[{"name":"Team A","score":100}]}],"sportId":"a"}]
[{"hasLiveOpened":"True","orderNo":"2250420085262301","matches":[{"sppd":[{"aName":"A","sCode":"1","sName":"A","bName":""},{"aName":"","sCode":"2","sName":"B","bName":"B"}],"Status":"2","MatchNo":"33730439"}],"sportName":"我的世界","lgName":"我的世界A","lgId":"41918","sportId":"46"}]


1816

被折叠的 条评论
为什么被折叠?



