Codet Codet - 2 months ago 12
Java Question

Java JSON weird error

When I run my program I am getting the error:

org.json.JSONException: A JSONObject text must begin with '{' at 1 [character 2 line 1]
at org.json.JSONTokener.syntaxError(JSONTokener.java:432)
at org.json.JSONObject.<init>(JSONObject.java:184)
at MovieLibrary.<init>(MovieLibrary.java:76)
at LibraryOfMovieDescriptions.main(LibraryOfMovieDescriptions.java:11)


Also, once I run the program, I check how my "movies2.json" has changed because that's the one I'm writing to to save the file, and it changes from initially only the file being { } to the file then being ’ t {}

I don't how I end up getting that in "movies2.json".

"movies.json", the file being used in the MovieLibrary constructor is this:

{ "Minions Puppy": {
"Released": "10 Dec 2013",
"Rated": "NR",
"Actors": ["Dave", "Gru"],
"Plot": "Dave seeing many owners walk their dogs wants a puppy of his own. He finds a mini-UFO who becomes his pal. This short film released with Despicable Me 2 chronicles how Dave helps the UFO return home.",
"Runtime": "4:16 min",
"Genre": ["Animation", "Family", "Cartoon"],
"Filename": "MinionsPuppy.mp4",
"Title": "Minions Puppy"
},
"Pretty Woman": {
"Released": "10 Dec 1973",
"Rated": "NR",
"Actors": ["Roy Orbison"],
"Plot": "One of Roys most famous songs.",
"Runtime": "3 min",
"Genre": ["Country Music"],
"Filename": "RoyOrbisonPrettyWoman.mp4",
"Title": "Pretty Woman"
},
"Minions Banana Song": {
"Released": "12 Dec 2015",
"Rated": "PG",
"Actors": ["Steve", "Kevin", "Bob", "Stuart"],
"Plot": "Banana is a song sung by The Minions in the teaser trailer of Despicable Me 2. It is a parody of the Beach Boys Barbara Ann. One minion gets annoyed by another, most likely Stuart, who keeps on playing his party horn while they are singing. So, at the end, he punched Stuart.",
"Runtime": "5 min",
"Genre": ["Animation", "Family", "Cartoon"],
"Filename": "MinionsBananaSong.mp4",
"Title": "Minions Banana Song"
},
"Minions Banana": {
"Released": "12 Dec 2015",
"Rated": "PG",
"Actors": ["Steve", "Kevin", "Stuart"],
"Plot": "Minions fight over a banana. In the process, they wreak havoc in the Bomb Factory.",
"Runtime": "5 min",
"Genre": ["Animation", "Family", "Cartoon"],
"Filename": "MinionsBanana.mp4",
"Title": "Minions Banana"
},
"Squatters Rights": {
"Released": "07 Jun 1946",
"Rated": "N/A",
"Actors": ["Dessie Flynn", "James MacDonald"],
"Plot": "Chip-n-Dale have set up house in the wood stove of Mickeys cabin. Pluto knows they are there, but Mickey only knows his matches keep going out when he tries to light a fire.",
"Runtime": "7 min",
"Genre": ["Cartoon", "Animation", "Family"],
"Filename": "MMSquattersRights.mp4",
"Title": "Squatters Rights"
}
}


So I would really love any help or explanation. Thanks in advance.
Here is the code:

MAIN CLASS

import java.io.Serializable;

class LibraryOfMovieDescriptions implements Serializable {
public static void main(String[] args){

MovieLibrary movieLibrary;
movieLibrary = new MovieLibrary("movies.json");

movieLibrary.toJsonFile("movies2.json");
}
}


MovieDescription Class

import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONArray;
import java.io.Serializable;

public class MovieDescription implements Serializable {

private String title;
private String rating;
private String release;
private String runtime;
private String plot;
private String filename;
private String genre;
private String actors;

public JSONObject toJSONObject() throws JSONException {
JSONObject obj = new JSONObject();
obj.put("Title", title);
obj.put("Rated", rating);
obj.put("Released", release);
obj.put("Runtime", runtime);
obj.put("Plot", plot);
obj.put("Filename", filename);


JSONArray a = new JSONArray();
String[] sArray = this.actors.split(" , ");
for(int i = 0; i < sArray.length; i++){
a.put(i);
}
obj.put("Actors", a);

JSONArray g = new JSONArray();
String[] gArray = this.genre.split(" , ");
for(int i = 0; i < gArray.length; i++){
g.put(i);
}
obj.put("Genre", g);

return obj;
}

public MovieDescription(JSONObject jsonObj) throws JSONException{
this.title = jsonObj.getString("Title");
this.rating = jsonObj.getString("Rated");
this.release = jsonObj.getString("Released");
this.plot = jsonObj.getString("Plot");
this.runtime = jsonObj.getString("Runtime");
this.filename = jsonObj.getString("Filename");

JSONArray g = jsonObj.getJSONArray("Genre");
for(int i = 0; i < g.length(); i++){
this.genre += g.get(i) + ", ";
}

JSONArray a = jsonObj.getJSONArray("Actors");
for(int i = 0; i < a.length(); i++){
this.actors += a.get(i) + ", ";
}
}

public MovieDescription(){
title = " ";
rating = " ";
release = " ";
runtime = " ";
plot = " ";
filename = " ";
genre = " ";
actors = " ";
}

public MovieDescription(String title, String rating, String release, String runtime, String plot, String filename,
String genre, String actors){
this.title = title;
this.rating = rating;
this.release = release;
this.runtime = runtime;
this.plot = plot;
this.filename = filename;
this.genre = genre;
this.actors = actors;
}

public void setTitle(String title){
this.title = title;
}

public String getTitle(){
return title;
}

public void setRating(String rating){
this.rating = rating;
}

public String getRating(){
return rating;
}

public void setRelease(String release){
this.release = release;
}

public String getRelease(){
return this.release;
}

public void setRuntime(String runtime){
this.runtime = runtime;
}

public String getRuntime(){
return runtime;
}

public void setPlot(String plot){
this.plot = plot;
}

public String getPlot(){
return plot;
}

public void setFilename(String filename){
this.filename = filename;
}

public String getFilename(){
return filename;
}

public void setGenre(String genre){
this.genre = genre;
}

public String getGenre(){
return genre;
}

public void setActors(String actors){
this.actors = actors;
}

public String getActors(){
return actors;
}

public String toString(){
String string = ("Title: " + title + "\n" + "Rating: " + rating + "\n" + "Released: " + release + "\n" +
"Runtime: " + runtime + "\n" + "Plot: " + plot + "\n" + "Filename: " + filename + "\n" + "Genre: " + genre
+ "\n" + "Actors: " + actors + "\n");

return string;
}

}


MovieLibrary Class

import org.json.JSONObject;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.json.JSONTokener;
import java.io.Serializable;
import java.io.ObjectOutputStream;

public class MovieLibrary implements Serializable {

private List<MovieDescription> movieLib = new ArrayList<MovieDescription>();

private int arraySize;

public MovieLibrary(){
arraySize = 0;
}

public boolean isEmpty(){
return arraySize == 0;
}

public MovieDescription get(String aTitle){
int i = indexOf(aTitle);
if(i == -1){
return null;
}
return movieLib.get(i);
}

public boolean add(MovieDescription aClip){
movieLib.add(aClip);
arraySize++;
return true;
}

public boolean remove(String aTitle){
int i = indexOf(aTitle);
if(i != -1){
movieLib.remove(i);
arraySize--;
}
return true;
}

public String[] getTitles(){
String[] s = new String[movieLib.size()];
for(int i = 0; i < movieLib.size(); i++){
s[i] = movieLib.get(i).getTitle();
}
return s;
}

private int indexOf(String aTitle){
for(int i = 0; i < movieLib.size(); i++)
if(((movieLib.get(i)).getTitle()).equals(aTitle)){
return i;
}
return -1;
}

public MovieLibrary(String jsonFile){

FileInputStream in = null;
JSONObject jsonObj = null;
String[] titles;

try{
in = new FileInputStream(jsonFile);
jsonObj = new JSONObject(new JSONTokener(in));
titles = JSONObject.getNames(jsonObj);
System.out.println("Adding Movies...");
for(int i = 0; i < titles.length; i++){
System.out.println(titles[i]);
JSONObject temp = jsonObj.getJSONObject(titles[i]);
MovieDescription movies = new MovieDescription(temp);
movieLib.add(movies);
}
System.out.println(movieLib);
in.close();
}
catch(Exception e){
e.printStackTrace();
if(in != null){
try{
in.close();
}
catch(IOException z){
z.printStackTrace();
System.exit(0);
}
}
}
}

public void toJsonFile(String jsonFileName){

JSONObject jsonObj = new JSONObject();
ObjectOutputStream out = null;

try{
for(int i = 0; i < movieLib.size(); i++)
jsonObj.put(movieLib.get(i).getTitle(),movieLib.get(i).toJSONObject());
out = new ObjectOutputStream(new FileOutputStream(jsonFileName));
out.writeObject(jsonObj.toString());
out.close();
}
catch(Exception e){
e.printStackTrace();
if(out != null){
try{
out.close();
}
catch(IOException z){
z.printStackTrace();
System.exit(0);
}
}
}


}
}

Answer

You don't want to use an ObjectOutputStream to write text. It's writing a serialized Java string and that explains the weird characters at the start of your file. Try using a FileWriter instead.

public void toJsonFile(String jsonFileName) {

    JSONObject jsonObj = new JSONObject();
    FileWriter out = null;

    try{
        for(int i = 0; i < movieLib.size(); i++)
            jsonObj.put(movieLib.get(i).getTitle(),movieLib.get(i).toJSONObject());
        out = new FileWriter(jsonFileName);
        out.write(jsonObj.toString());
        out.close();
    }
    catch(Exception e){
        e.printStackTrace();
        if(out != null){
            try{
            out.close();
            }
            catch(IOException z){
                z.printStackTrace();
                System.exit(0);
            }
        }
    }
}

P.S. You might also change your try/catch block to a try-with-resources statement.

Comments