-1

I am trying to parse a JSON Array from a .txt file with processing. However I keep on getting this error:

java.lang.RuntimeException: A JSONArray text must start with '['
    at processing.data.JSONArray.<init>(JSONArray.java:140)
    at processing.data.JSONArray.<init>(JSONArray.java:126)
    at processing.core.PApplet.parseJSONArray(PApplet.java:5494)
    at sketch_230108a.fileSelected(sketch_230108a.java:31)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at processing.core.PApplet.selectCallback(PApplet.java:5966)
    at processing.awt.ShimAWT.selectImpl(ShimAWT.java:835)
    at processing.awt.ShimAWT.lambda$selectInput$0(ShimAWT.java:742)
    at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
    at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:771)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:722)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:716)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:741)
    at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

I tried this code:

PrintWriter output;  
  String data = "[ \"Capra hircus\", \"Panthera pardus\", \""+"90"+"\" ]";

void setup() {
  output = createWriter("positions.txt"); 
  output.print(data);
  output.flush();
  output.close();
  selectInput("Select a file to process:", "fileSelected");
}
 
void fileSelected(File selection) {

   JSONArray json = parseJSONArray(selection.toString());
  if (json == null) {
    println("JSONArray could not be parsed");
  } else {
    String species = json.getString(0);
    println(species);
  }
}

I am trying to get an output of Capra hircus, however I just get a JSONArray could not be parsed, and the error.

Rose
  • 29
  • 5
  • 1
    `File.toString()` (`selection.toString()` in your code) returns file path (doesn't matter absolute or not), you actually need to get file contents, for example: `new String(Files.readAllBytes(selection.toPath()), Charset.defaultCharset())` – Andrey B. Panfilov Jan 09 '23 at 01:00
  • 1
    @AndreyB.Panfilov would you mind writing an answer post if that's an answer to the question? – starball Jan 09 '23 at 01:01

1 Answers1

0

Use loadStrings or loadBytes

void fileSelected(File selection) {
   String[] lines = loadStrings(selection);
   for (int i =0; i< lines.length; i++) {
    println(lines[i]);
   }
}
Rose
  • 29
  • 5