2016-09-16 9 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) 

また、私はプログラムを実行したら、私はそれは私が「1ですので、私の「movies2.json」はどのように変化したかを確認してくださいファイルを保存するために書き込むと、最初は{}になっているファイルだけがファイルに変更され、その後は¬It {}になります。

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


} 
} 
+0

JSONにオブジェクトを読み書きするためにGsonまたはJacksonを使用することをお勧めします –

+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