[英]Java: Get JavaScript Array Elements from page
我現在可以拉一個JavaScript聲明,例如:
var cars = ["Saab", "Volvo", "BMW"];
從頁面解析。
我希望能夠從此聲明中獲取數組的所有元素(“ Saab”,“ Volvo”,“ BMW”)。
我應該為此使用一些javascript引擎,還是從我的Java代碼中獲取javascript變量值的最佳方法是什么?
如果不存在能夠做到這一點的東西,我不希望自己發明輪子,所以我只是在尋找可以用來實現此功能的東西的建議。
我假設您找到了一種將JavaScript對象/數組作為String或Stream傳輸到Java域的方法。 您現在想要的是JSON解析器。
一種方法是使用json.org或其他庫。 在以下線程中可以找到有關json解析的更多信息: 如何在Java中解析JSON
[org.json] [1]庫易於使用。 下面的示例代碼:
import org.json.*; JSONObject obj = new JSONObject(" .... "); String pageName = obj.getJSONObject("pageInfo").getString("pageName"); JSONArray arr = obj.getJSONArray("posts"); for (int i = 0; i < arr.length(); i++) { String post_id = arr.getJSONObject(i).getString("post_id"); ...... } You may find extra examples from: [Parse JSON in Java][2]
可下載的jar: http : //mvnrepository.com/artifact/org.json/json
[1]: http : //www.json.org/java/index.html
[2]: http : //theoryapp.com/parse-json-in-java/
您可能還需要研究Java 7引入的jsonb( https://jcp.org/en/jsr/detail?id=353 )。您可以綁定對象模型並將JSON對象轉換為Java對象,反之亦然。
您可以遍歷“窗口”中的所有值
for ( var key in window )
{
if ( typeof window]key] == 'object' && window]key].length > 0 )
{
//this is the array you are looking for
}
}
您可以使用httpunit從Java訪問javascript對象
使用JDK 8,以下代碼可以工作:
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
String js = "var carsfromjs = [\"Saab\", \"Volvo\", \"BMW\"]";
engine.eval(js);
String[] cars = (String[])engine.eval("Java.to(carsfromjs, \"java.lang.String[]\")");
for(int i=0; i<cars.length; i++){
System.out.println(cars[i]);
}
您可以找到許多通過“ nashorn”訪問Javascript代碼的方法:
方法1:JSON解析器,作為Alex的答案。
方法2: Java的JavaScript解析器
方法3:正則表達式(我發現的一種奇怪方法!)
第一個模式是var\\s+([a-zA-Z0-9]+)\\s+=\\s+\\[(.*)\\]\\s*;*
var +一個或多個空格+ 變量名 ($ 1)+一個或多個空格+等號+一個或多個空格+ 數組內容 ($ 2)+ ......
第二個模式是"(.*?)"
,獲取兩個引號之間的字符串。
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class JSParser {
public String arrayName;
private String tempValues;
public ArrayList<String> values = new ArrayList<String>();
public boolean parseJSArray(String arrayStr){
String p1 = "var\\s+([a-zA-Z0-9]+)\\s+=\\s+\\[(.*)\\]\\s*;*";
Pattern pattern1 = Pattern.compile(p1);
Matcher matcher = pattern1.matcher(arrayStr);
if(matcher.find()){
arrayName = matcher.group(1);
tempValues = matcher.group(2);
Pattern getVal = Pattern.compile("\"(.*?)\"");
Matcher valMatcher = getVal.matcher(tempValues);
while (valMatcher.find()) { // find next match
String value = valMatcher.group(1);
values.add(value);
}
return true;
}else{
return false;
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.