Gson wirft MalformedJsonException und andere Ausnahmen

Habe ich versucht, Daten zu speichern, um json-string in eine txt-Datei mit Gson, und dann wieder mit Gson entweder. Dinge, die gut gehen, wenn ich es in eclipse. Aber beim Verpacken jar, Gson Exceptions wirft.

Hier ist der code für das speichern der Datei.

String gsonStr = gson.toJson(masterShips);  //masterShips is ArrayList<Ship>
BufferedWriter writer = null;
try {
    writer = new BufferedWriter(new FileWriter("D:\\master_ship.txt"));
    writer.write(gsonStr);
} catch (IOException e) {
    System.err.println(e);
} finally {
    if (writer != null) {
        try {
            writer.close();
        } catch (IOException e) {
            System.err.println(e);
        }
    }
}

Dann lese ich die Datei in eclipse mit diesem code (und es funktioniert):

Scanner in = new Scanner(new FileReader("D:\\master_ship.txt"));

String str = in.nextLine();
Log.toDebug(str);
in.close();
JsonParser parser = new JsonParser();
JsonElement je = parser.parse(str);
JsonArray ja = je.getAsJsonArray();
for (int i=0; i<ja.size(); ++i) { 
    ... 
}

Aber nach verpackt in Glas und führen Sie in cmd-Ausnahme tritt auf:

Exception in thread "main" com.google.gson.JsonSyntaxException: com.google.gson.
stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malform
ed JSON at line 1 column 4
        at com.google.gson.JsonParser.parse(JsonParser.java:65)
        at com.google.gson.JsonParser.parse(JsonParser.java:45)
        at kan.util.Master.loadMasterShip(Master.java:44)
        at kan.util.Master.load(Master.java:27)
        at kan.Main.main(Main.java:22)
Caused by: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLeni
ent(true) to accept malformed JSON at line 1 column 4
        at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1505)
        at com.google.gson.stream.JsonReader.checkLenient(JsonReader.java:1386)
        at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:531)
        at com.google.gson.stream.JsonReader.peek(JsonReader.java:414)
        at com.google.gson.JsonParser.parse(JsonParser.java:60)
        ... 4 more

Entsprechend dem Hinweis der Ausnahme, änderte ich meinen code und es funktioniert immer noch in eclipse:

Scanner in = new Scanner(new FileReader("D:\\master_ship.txt"));

String str = in.nextLine();
in.close();

Reader reader = new StringReader(str);
JsonReader jr = new JsonReader(reader);
jr.setLenient(true);
JsonParser parser = new JsonParser();
JsonElement je = parser.parse(jr);
JsonArray ja = je.getAsJsonArray();
for (int i=0; i<ja.size(); ++i) { 
... 
}

Aber jar gescheitert und wirft

Exception in thread "main" java.lang.IllegalStateException: This is not a JSON A
rray.
    at com.google.gson.JsonElement.getAsJsonArray(JsonElement.java:106)
    at kan.util.Master.loadMasterShip(Master.java:58)
    at kan.util.Master.load(Master.java:30)
    at kan.Main.main(Main.java:22)

Wie vorgeschlagen von Sotirios ich schneiden Sie die Länge der arraylist nach unten, und wenn ich Sie erhöhen die Anzahl der Schiffe um 4, etwas schief geht. Hier ist die json:

[{"id":1,"name":"睦月","type":2,"rank":2,"fuelMax":15,"bulletMax":15,"slotNum":2,"speed":10,"afterLv":20,"afterId":254,"range":1,"powerups":[1,1,0,0]},{"id":2,"name":"如月","type":2,"rank":1,"fuelMax":15,"bulletMax":15,"slotNum":2,"speed":10,"afterLv":20,"afterId":255,"range":1,"powerups":[0,1,0,0]},{"id":6,"name":"長月","type":2,"rank":1,"fuelMax":15,"bulletMax":15,"slotNum":2,"speed":10,"afterLv":20,"afterId":258,"range":1,"powerups":[0,1,0,0]},{"id":7,"name":"三日月","type":2,"rank":1,"fuelMax":15,"bulletMax":15,"slotNum":2,"speed":10,"afterLv":20,"afterId":260,"range":1,"powerups":[0,1,0,0]}]
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              colunm 473

Exception in thread "main" com.google.gson.JsonSyntaxException: com.google.gson.
stream.MalformedJsonException: Unterminated object at line 1 column 473
        at com.google.gson.internal.Streams.parse(Streams.java:56)
        at com.google.gson.JsonParser.parse(JsonParser.java:84)
        at kan.util.Master.loadMasterShip(Master.java:55)
        at kan.util.Master.load(Master.java:30)
        at kan.Main.main(Main.java:22)
Caused by: com.google.gson.stream.MalformedJsonException: Unterminated object at
 line 1 column 473
        at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1505)
        at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:480)
        at com.google.gson.stream.JsonReader.hasNext(JsonReader.java:403)
        at com.google.gson.internal.bind.TypeAdapters$25.read(TypeAdapters.java:
666)
        at com.google.gson.internal.bind.TypeAdapters$25.read(TypeAdapters.java:
659)
        at com.google.gson.internal.bind.TypeAdapters$25.read(TypeAdapters.java:
642)
        at com.google.gson.internal.Streams.parse(Streams.java:44)
        ... 4 more

Kann mir jemand helfen mit dieser, werden Sie reaally preciated!

  • Lassen Sie uns sehen Sie Ihre JSON.
  • Es ist wirklich eine lange json, ich weiß nicht, wie Sie zu zeigen. Es ist eine ArrayList mit mehreren hundert Schiffen mit mehr als 10 params.
  • Schneiden Sie es nach unten, um die kleinste Menge würde das problem reproduzieren.
  • Dein code funktioniert bei mir.
  • Sie verwendet die json habe ich nur noch? Mit dem parser-code? Ich kann nicht finden, was ist falsch mit der json-in der Spalte Ausnahme erwähnt
  • Ich verwendet das json-du gepostet hast mit dem code, bevor Sie den Staat But jar failed and throws.
  • Haben Sie verpackt es in ein Gefäß? (nur für den Fall
  • Nein, das würde nichts ändern. Tun Sie mir einen gefallen und rufen Sie System.out.println(Charset.defaultCharset()); und sagen Sie uns das Wert.
  • Auch ist Ihre JSON-alle auf einer Linie? String str = in.nextLine(); liest nur eine Zeile.
  • Das ist UTF-8
  • Die json erzeugt wird, durch Gson im ersten Stück code, den ich vorgestellt. Es soll eine Zeile und die Suche in Notepad++ bestätigt. (Allerdings nopepad wickelt sich die line, aber es gibt keine 'enter' in der Zeile
  • Nur um sicher zu sein Lesen Sie den vollständigen InputStream statt nur die nextLine().
  • Ich fand dies in cmd-Ausgabe {"id":7,"nam e":"涓夋棩鏈?,"type":2,"rank":1,"fuelMax":15,"bulletMax":15,"slotNum":2,"speed": 10,"afterLv":20,"afterId":260,"range":1,"powerups":[0,1,0,0]} Scheint, es ist ein " geändert ?.
  • Es ist möglich, die Zeichen nicht gelesen werden können, in UTF-8 ist die Standard-Zeichenkodierung. Finden Sie heraus, welchen Zeichensatz können Lesen, diese Zeichen und verwenden Sie es. Sie haben die Datei zu Lesen, auf eine andere Weise als Scanner mit einem FileReader.
  • Aber die peinliche Sache ist, dass alles in Ordnung ist in eclipse. Ich bin nicht vertraut mit IO doch, ich bin es zu tun, aber es braucht Zeit.
  • Ich kann es nicht erklären von wo ich stehe :p

InformationsquelleAutor bijiDango | 2013-12-26
Schreibe einen Kommentar