Java:从页面获取JavaScript数组元素

时间:2015-12-04 09:50:47

标签: javascript java rhino

我正处于可以提取单个javascript声明的位置,例如:

var cars = ["Saab", "Volvo", "BMW"];

从页面解析。

我希望能够从这个宣言中获得阵列的所有元素(“萨博”,“沃尔沃”,“宝马”)。

我是否应该使用一些javascript引擎,或者从我的Java代码获取javascript变量值的其他方法是什么。

如果已经有能够做到这一点的东西,我会讨厌重新发明轮子,所以我只是在寻找可以用来做这个功能的建议。

4 个答案:

答案 0 :(得分:1)

我假设你找到了一种将javascript对象/数组作为String或Stream传输到Java域的方法。你现在想要的是一个JSON解析器。

一种方法是使用json.org或其他库。有关json解析的更多信息可以在这个帖子中找到: How to parse JSON in Java

  

[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对象,反之亦然。

答案 1 :(得分:0)

你可以遍历'window'中的所有值

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对象

答案 2 :(得分:0)

使用JDK 8,代码如下:

.bjoffersbigpop {
  background: #d1005c;
  padding: 20px;
  color: #fff;
  min-height: 200px;
  position: absolute;
  bottom:100%;         /*remove top and replace with bottom*/
  margin-top:-20px;    /*minus the size of your arrow - optional*/
  left: -47px;
  width: 300px;
  z-index: 100;
}

您可以通过&#34; nashorn&#34;找到许多方法来访问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/

答案 3 :(得分:0)

方法1:JSON解析器,作为Alex的回答。

方法2:Javascript parser for Java

方法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;
        }

    }

}