Java JSON奇怪的错误

时间:2016-09-16 04:13:39

标签: java json

当我运行程序时,我收到错误:

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)

此外,一旦我运行该程序,我会检查我的“movies2.json”是如何更改的,因为这是我正在编写的用于保存文件的那个,并且它从最初只将文件{}更改为文件然后是¬ít{}

我不知道如何在“movies2.json”中获得它。

“movies.json”,MovieLibrary构造函数中使用的文件是:

{  "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"
 }
}

所以我真的很喜欢任何帮助或解释。提前致谢。 这是代码:

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类

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类

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);
            }
        }
    }


}
}

1 个答案:

答案 0 :(得分:1)

您不想使用ObjectOutputStream来撰写文字。它正在编写一个序列化的Java字符串,它解释了文件开头的奇怪字符。请尝试使用FileWriter

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。您也可以将try/catch块更改为try-with-resources statement