【问题标题】:Interpret/parse Javascript Variables in c# with JInt or similar使用 JInt 或类似方法在 c# 中解释/解析 Javascript 变量
【发布时间】:2013-05-28 19:57:29
【问题描述】:

我正在尝试构建一个使用为 JavaScript 设计的 API 的应用程序。它不是发送 JSON 或 XML,而是发送一个带有 JavaScript 对象的 Script 标签,如下所示:

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

我试图只取出“jsonData”属性。在浏览器领域,你可以去:

apiresult.data.jsonData;

显然我不能在 C# 中做到这一点。我试过像这样使用 Jint 和 HtmlAgilityPack:

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,以便将其解析到我的对象中?

【问题讨论】:

    标签: c# jint


    【解决方案1】:

    我遇到了同样的问题,这是我使用 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 });
    

    【讨论】:

      【解决方案2】:

      最后我使用jurassic 来做到这一点。比 JInt 更容易使用。我的代码现在看起来像这样:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-01
        • 1970-01-01
        • 2012-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-01
        相关资源
        最近更新 更多