我正处于可以提取单个javascript声明的位置,例如:
var cars = ["Saab", "Volvo", "BMW"];
从页面解析。
我希望能够从这个宣言中获得阵列的所有元素(“萨博”,“沃尔沃”,“宝马”)。
我是否应该使用一些javascript引擎,或者从我的Java代码获取javascript变量值的其他方法是什么。
如果已经有能够做到这一点的东西,我会讨厌重新发明轮子,所以我只是在寻找可以用来做这个功能的建议。
答案 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代码。 :
答案 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;
}
}
}