用JInt或类似的语言在c#中解释/解析Javascript变量

本文关键字:解释 解析 变量 Javascript JInt 语言 | 更新日期: 2023-09-27 18:15:59

我试图构建一个使用API的应用程序,该API是为JavaScript制作的。它不发送JSON或XML,而是发送一个Script标签,其中包含一个JavaScript对象,如下所示:

<script>
var apiresult = {
    success: true,
    data: {
        userName: "xxxxx",
        jsonData: { 
            "id" : "8342859",
            "price" : "83.94"
            }
        }
    };
</script>

我试图得到只是"jsonData"属性。在浏览器中,你可以输入:

apiresult.data.jsonData;

显然我不能在c#中这样做。我试过使用Jint和html lagilitypack,像这样:

HtmlDocument = await client.GetHTMLAsync(url);
string scriptTag = htmlResult.DocumentNode.SelectNodes("//script").InnerHtml;
scriptTag += " return apiresult.data.jsonData;
JintEngine engine = new JintEngine();
Jint.Native.JsObject r = (Jint.Native.JsObject)engine.Run(scriptTag);

如果我在观察窗口中展开"r.Results",它会显示变量值,但我如何才能得到原始JSON,以便我可以将其解析为我的对象?

用JInt或类似的语言在c#中解释/解析Javascript变量

我遇到了同样的问题,下面是我如何使用Jint

        var engine =new Engine();
        var html = 
                    @"<script>
                        var apiresult = {
                            success: true,
                            data: {
                                userName: ""xxxxx"",
                                jsonData: { 
                                    ""id"" : ""8342859"",
                                    ""price"" : ""83.94""
                                    }
                                }
                            };
                    </script>";

        var doc=new HtmlDocument();
        doc.LoadHtml(html);
        var script = doc.DocumentNode.SelectNodes("//script").First().InnerHtml;
        var result = engine
            .Execute(script)
            .Execute("var x=apiresult.data.jsonData;")
            .GetValue("x");
        var jsonData = engine.Json.Stringify(result, new[] { result });

最后我用侏罗纪来做这个。比JInt更容易使用。我的代码现在看起来像这样:

ScriptEngine engine = new ScriptEngine();
object result = engine.Evaluate(scriptString);
var json = Jurassic.Library.JSONObject.Stringify(engine, result);