簡體   English   中英

Java:從頁面獲取JavaScript數組元素

[英]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. http://winterbe.com/posts/2014/04/05/java8-nashorn-tutorial/
  2. http://www.oracle.com/technetwork/articles/java/jf14-nashorn-2126515.html
  3. http://docs.oracle.com/javase/8/docs/technotes/guides/scripting/nashorn/

方法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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM