2016-09-16 87 views
1

當我運行我的程序,我得到的錯誤: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」是如何改變,因爲這是一個我m寫入以保存文件,並且它從最初僅改變文件到文件,然後變爲文件然後我將不知道如何在「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" 
} 
} 

所以,我真的很喜歡,任何幫助或解釋。提前致謝。 下面是代碼:

主類

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


} 
} 
+0

我建議使用Gson或Jackson來讀取和寫入對象到JSON –

+0

@ cricket_007我將如何去改變我現在使用Gson的代碼? – Codet

+0

如果你仔細閱讀一些文檔,你會發現你不需要自己的'toJSONObject'方法。這是我看到的唯一的主要變化 –

回答

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

+0

我做了你的建議,我仍然得到相同的錯誤。 – Codet

+0

@Codet - 從「ObjectOutputStream」切換到「FileWriter」時,輸出完全沒有變化?這很難相信。你確定你重建了這個項目嗎? –

+0

它確實有效!出於某種原因,我刪除了「movies2.json」,並創建了一個名爲「moviesJava」的新黑色json文件,它起作用了!非常感謝!! – Codet