JavaScript array to java

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

Answers (3)

DzinVision
DzinVision

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

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:

  • it cannot be run in background (using backgound services and broadcast recievers for example), since webview is a gui element
  • it has a security whole, because ANY js file that gets loaded into webview can call the function (now called only when page is loaded) at ANY time. This is how it can inject some other text and so on...

So if anyone has a better solution please let me know.

Upvotes: 1

Alkis Kalogeris
Alkis Kalogeris

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

Related Questions