我正在摆弄一些使用JScript.NET的script for Fiddler。我有一个格式的字符串:
{"params":{"key1":"somevalue","key2":"someothervalue","key3":"whatevervalue", ...
我希望匹配并显示"key2":"someothervalue"
someothervalue
可以是任何值,但键是静态的。
使用好的旧sed
和bash
我可以替换我要找的部分:
$ a='{"params":{"key1":"somevalue","key2":"someothervalue","key3":"whatevervalue", ...'
$ echo $a | sed -r 's/"key2":"[^"]+"/replaced/g'
{"params":{"key1":"somevalue",replaced,"key3":"whatevervalue", ...
现在。我希望使用JScript.NET将该部分提取到变量中,而不是替换它。怎么办?
答案 0 :(得分:1)
最优雅的方法是使用JSON解析器。我个人的偏好是使用htmlfile
COM对象导入IE的JSON解析器。
import System;
var str:String = '{"params":{"key1":"foo","key2":"bar","key3":"baz"}}',
htmlfile = new ActiveXObject('htmlfile');
// force htmlfile COM object into IE9 compatibility
htmlfile.IHTMLDocument2_write('<meta http-equiv="x-ua-compatible" content="IE=9" />');
// clone JSON object and methods into familiar syntax
var JSON = htmlfile.parentWindow.JSON,
// deserialize your JSON-formatted string
obj = JSON.parse(str);
// access JSON values as members of a hierarchical object
Console.WriteLine("params.key2 = " + obj.params.key2);
// beautify the JSON
Console.WriteLine(JSON.stringify(obj, null, '\t'));
在以下控制台输出中编译,链接和运行结果:
params.key2 = bar
{
"params": {
"key1": "foo",
"key2": "bar",
"key3": "baz"
}
}
或者,还有至少一个couple of .NET namespaces,它提供了将对象序列化为JSON字符串以及将JSON字符串反序列化为对象的方法。但不能说我是粉丝。 JSON.parse()
和JSON.stringify()
的ECMAScript符号肯定比任何符合标准的疯狂going on at Microsoft更容易且更不那么陌生。
虽然我当然不建议将JSON(或任何其他分层标记,如果可以帮助)作为复杂的文本进行抓取,但JScript.NET将处理许多熟悉的Javascript方法和对象,包括正则表达式对象和正则表达式替换字符串。
sed语法:
echo $a | sed -r 's/("key2"):"[^"]*"/\1:"replaced"/g'
JScript.NET语法:
print(a.replace(/("key2"):"[^"]*"/, '$1:"replaced"'));
JScript.NET,就像JScript和JavaScript一样,也允许为替换调用lambda函数。
print(
a.replace(
/"(key2)":"([^"]*)"/,
// $0 = full match; $1 = (key2); $2 = ([^"]*)
function($0, $1, $2):String {
var replace:String = $2.toUpperCase();
return '"$1":"' + replace + '"';
}
)
);
...或者使用key2
对象的RegExp
方法提取exec()
的值:
var extracted:String = /"key2":"([^"]*)"/.exec(a)[1];
print(extracted);
请注意,因为如果没有匹配项,[1]
结果的检索元素exec()
将导致索引超出范围的异常。可能要if (/"key2":/.test(a))
或添加try...catch
。或者更好的是,只需执行我之前说过的操作并将JSON反序列化为对象。