2013-05-28 70 views
2

我試圖構建一個應用程序,該應用程序使用JavaScript製作的API。而不是向下發送JSON或XML發送腳本標籤有一個JavaScript對象中它像這樣:用JInt或類似語言解釋/解析c#中的變量

<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回來瞭如此我可以解析它到我的對象?

回答

4

最後我用jurassic來做到這一點。比JInt更容易使用。我的代碼現在看起來像這樣:

ScriptEngine engine = new ScriptEngine(); 

object result = engine.Evaluate(scriptString); 

var json = Jurassic.Library.JSONObject.Stringify(engine, result); 
3

我打的是同樣的問題,這裏是我如何與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 }); 
做到了