Type ‘Fiddler.WebFormats.JSON.JsonDecode’ could not be found:Fiddler Classic5.x不支持Fiddler.WebFormats

 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: 

https://www.telerik.com/forums/new-version-of-classic-fiddler-doesn-t-find-type-fiddler-webformats-json-jsondecode

 原作者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"}] 



​​​​​​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值