我可以使用Fiddler脚本修改JSON响应吗?

时间:2014-04-15 21:15:32

标签: proxy fiddler

以下是我从服务器获得的响应(正文)。我想修改一些关键值对。 我使用了以下方法:

var bodystr=oSession.GetResponseBodyAsString();
var bodyjson=Fiddler.WebFormats.JSON.JsonDecode(bodystr); 

bodyjson没有任何我期望的内容。 (我尝试使用MessageBox.Show(bodyjson.Sales.Qty);,但这会给我一个错误。)

{
    "Sales" : {
        "Qty" : 1,
        "Item" : {
            "value" : "7"
        },
        "TaxCode" : {
            "value" : "NON"
        },
        "UnitPrice" : 3
    },
    "LineNum" : 0,
    "DetailType" : "Sales",
    "Amount" : 3,
    "Id" : "1"
}

除了字符串替换方法之外,还有什么方法可以更改JSON响应吗?

2 个答案:

答案 0 :(得分:5)

Fiddler的JsonDecode函数创建一个对象;它不会创建您期望的对象类型,即使它确实如此,更改该对象中的值也不会对构成响应主体的字符串产生任何自动影响。

请参阅http://www.telerik.com/forums/how-to-use-fiddler-webformats-json-jsondecode,了解该对象的工作原理。

您需要执行bodyjson.JSONObject["Sales"]["Qty"]之类的操作才能获得价值。进行任何更改后,您需要在对象上调用JsonEncode以获取字符串,然后将响应的主体设置为该字符串。

    var s = '{"Sales" : {  "Qty" : 8,     "Item" : {            "value" : "7"          },          "TaxCode" : {            "value" : "NON"          },          "UnitPrice" : 3        },        "LineNum" : 0,        "DetailType" : "Sales",        "Amount" : 3,        "Id" : "1"}';
    var j = Fiddler.WebFormats.JSON.JsonDecode(s);
    MessageBox.Show(j.JSONObject["Sales"]["Qty"]);
    j.JSONObject["Sales"]["Qty"] = 4;
    MessageBox.Show(Fiddler.WebFormats.JSON.JsonEncode(j.JSONObject));

如果您只是想对正文进行微不足道的更改,请不要费心将字符串转换为对象,只需直接更改字符串本身即可。

答案 1 :(得分:2)

上面的帖子帮助我完成了这项工作,我的完整示例如下

我想在发送之前更改的JSON如下

{
   "ConsistId":"09C31636-0D8E-4C92-B09C-8413366E2D79",
   "UserName":"Test",
   "Date":"2016-07-19T13:10:00"
}


 static function OnBeforeRequest(oSession: Session) {

    if(oSession.HostnameIs("localhost")) {
        oSession["ui-backcolor"] = "lime";
        oSession["ui-bold"] = "Bold text here"

        // Convert the request body into a string
        var oBody = System.Text.Encoding.UTF8.GetString(oSession.requestBodyBytes);

        // Convert the text into a JSON object
        var j = Fiddler.WebFormats.JSON.JsonDecode(oBody);

        //Change the ConsistId value
        j.JSONObject["ConsistId"] = "A9C01636-0D8E-4C92-B09C-8413366E2D79";

        // Convert back to a byte array
        var modBytes = Fiddler.WebFormats.JSON.JsonEncode(j.JSONObject);

        // Convert json to bytes, storing the bytes in request body
        var mod = System.Text.Encoding.UTF8.GetBytes(modBytes);
        oSession.RequestBody = mod;

    }
...

这改变了请求,所以现在需要弄清楚如何显示填充guid id的提示