Reputation: 207
I have an javascript array representing a schedule for all my school https://dl.dropboxusercontent.com/u/16258361/urnik/data.js . I'm coding an android app and i need to download data and somehow parse it to java array. I can even use php or other web service that would download data and make json/xml of it or someting similar. But so far i can't find any good solution, so I'm asking you for any ideas.
Thanks :)
Upvotes: 1
Views: 452
Reputation: 56
This should work.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) throws Exception {
String html = "";
URL url = new URL("https://dl.dropboxusercontent.com/u/16258361/urnik/data.js");
URLConnection connection = url.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
html += inputLine;
in.close();
String array[] = html.split("podatki");
ArrayList<String> dataArray = new ArrayList<String>();
for (int i = 2; i < array.length; i++)
dataArray.add(array[i]);
String last = dataArray.get(dataArray.size()-1);
String lastCleared = "";
for (int i = 0; i < last.length(); i++) {
if (!last.substring(i, i+1).contains("r")) lastCleared += last.substring(i, i+1);
else break;
}
dataArray.set(dataArray.size() - 1, lastCleared);
for (int i = 0; i < dataArray.size(); i++) {
String string = dataArray.get(i);
if (string.contains("new Array")) {
dataArray.remove(i);
i--;
}
else {
string = string.replaceAll("]\\[", ";");
string = string.replaceAll("\\[", "");
string = string.replaceAll("]", "");
string = string.replaceAll("\"", "");
string = string.replace(" = ", ";");
dataArray.set(i, string);
}
}
int lastIndex1;
String string = "";
String lastString = dataArray.get(dataArray.size() - 1);
for (int i = 0; i < lastString.length(); i++) {
if (lastString.substring(i, i+1).contains(";"))
break;
string += lastString.substring(i, i+1);
}
lastIndex1 = Integer.parseInt(string);
boolean start = false;
for (int i = 0; i < lastString.length(); i++) {
if (start) {
string = lastString.substring(i, i + 1);
break;
}
if (lastString.substring(i, i+1).contains(";"))
start = true;
}
int lastIndex2 = Integer.parseInt(string);
String finalData[][] = new String[lastIndex1+1][lastIndex2+1];
for (int i = 0; i < dataArray.size(); i++) {
String components[] = dataArray.get(i).split(";");
if (components.length == 3)
finalData[Integer.parseInt(components[0])][Integer.parseInt(components[1])] = components[2];
else
finalData[Integer.parseInt(components[0])][Integer.parseInt(components[1])] = "";
}
for (int i = 0; i < finalData.length; i++) {
for (int j = 0; j < finalData[i].length; j++)
System.out.println(finalData[i][j]);
System.out.println("\n");
}
}
}
Upvotes: 1
Reputation: 207
Okay finally i got trough it and so I'm answering my own question.
Ntsh's idea of using ScriptEngine (see question's comments) was nice and worked nice in java, but since it's not part of android by default, I had to import the jar. Even that the code compiles, it just doesn't seem to work on some devices (i got it working only in my 4.2 Genymotion VM).
So I searched for another approach and decided to use webview to run javascrip. This seems to be a bad solution, but it works:
First I made a php file on server, that takes js file, adds some html and javascript code around it, to make it valid html and to make json out of this js array and prints it.
On android I just open this url in hidden webview and once page is loaded, I take it's source and extract relevant data, to parse it from json to java. This post was very helpful for that.
However, this approach has some disadvantages:
So if anyone has a better solution please let me know.
Upvotes: 1
Reputation: 17765
About the iOS part, I found this http://hayageek.com/execute-javascript-in-ios/
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import sun.org.mozilla.javascript.internal.NativeArray;
public class Main {
public static void main(String[] args) {
try {
URL jsUrl = new URL("https://dl.dropboxusercontent.com/u/16258361/urnik/data.js");
Reader reader = new InputStreamReader(jsUrl.openStream());
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
// evaluate script
engine.eval(reader);
System.out.println(Arrays.toString(parseJsArray(engine, "podatki").toArray()));
System.out.println(Arrays.toString(parseJsArray(engine, "razredi").toArray()));
System.out.println(Arrays.toString(parseJsArray(engine, "ucitelji").toArray()));
System.out.println(Arrays.toString(parseJsArray(engine, "ucilnice").toArray()));
} catch (Exception e) {
e.printStackTrace();
}
}
public static List<Object> parseJsArray(ScriptEngine engine, String key) {
NativeArray jsVar = (NativeArray)engine.get(key);
List<Object> list = new ArrayList<Object>((int)jsVar.getLength());
for(int i = 0; i < jsVar.getLength(); i++) {
if(jsVar.get(i).getClass().equals(NativeArray.class)) {
NativeArray inner = (NativeArray)jsVar.get(i);
List<Object> innerList = new ArrayList<Object>((int)inner.getLength());
for(int j = 0; j < inner.getLength(); j++) {
innerList.add(inner.get(j));
}
list.add(innerList);
} else {
list.add(jsVar.get(i));
}
}
return list;
}
}
Upvotes: 0