2015-06-28 2 views
3

Я почти закончил с моей программой, он загружается идеально, но одна проблема, с которой я сталкиваюсь, - это когда я редактирую файл json через свою программу, я не могу перезагрузить json-файл, потому что, когда я сохраняю файл, форматирование становится другим.Как написать json-файл в определенном формате?

Так что мой вопрос в том, как отформатировать json-файл так же, как я его читаю?

Вот мой метод для написания нового json-файла.

public static boolean write(File npcDefFile) { 
    try { 
     FileWriter writer = new FileWriter(npcDefFile); 
     Throwable localThrowable3 = null; 
     try { 
      Gson gson = new Gson(); 
      String json = gson.toJson(NPCDefinitions.getNPCDefinitions()); 
      writer.write(json); 
      writer.flush(); 
     } catch (Throwable localThrowable1) { 
      localThrowable3 = localThrowable1; 
      throw localThrowable1; 
     } finally { 
      if (writer != null) { 
       if (localThrowable3 != null) { 
        try { 
         writer.close(); 
        } catch (Throwable localThrowable2) { 
         localThrowable3.addSuppressed(localThrowable2); 
        } 
       } else { 
        writer.close(); 
       } 
      } 
     } 
    } catch (NullPointerException | IOException e) { 
     System.out.println(e.getLocalizedMessage()); 
     return false; 
    } 
    return true; 
} 

Вот правильный формат (3 Space Tab)

[ 
    { 
    "id": 0, 
    "name": "Hans", 
    "examine": "Servant of the Duke of Lumbridge.", 
    "combat": 0, 
    "size": 1, 
    "attackable": false, 
    "aggressive": false, 
    "retreats": false, 
    "poisonous": false, 
    "respawn": 10, 
    "maxHit": 0, 
    "hitpoints": 0, 
    "attackSpeed": 7, 
    "attackAnim": 0, 
    "defenceAnim": 0, 
    "deathAnim": 0, 
    "attackBonus": 0, 
    "defenceMelee": 0, 
    "defenceRange": 0, 
    "defenceMage": 0 
    }, 
    { 
    "id": 1, 
    "name": "Man", 
    "examine": "One of Wildy's many citizens.", 
    "combat": 2, 
    "size": 1, 
    "attackable": true, 
    "aggressive": false, 
    "retreats": true, 
    "poisonous": false, 
    "respawn": 10, 
    "maxHit": 1, 
    "hitpoints": 7, 
    "attackSpeed": 7, 
    "attackAnim": 422, 
    "defenceAnim": 1834, 
    "deathAnim": 836, 
    "attackBonus": 9, 
    "defenceMelee": 9, 
    "defenceRange": 9, 
    "defenceMage": 0 
    } 
] 

Вот формат после того, как я сохранить файл в новый файл JSON. (Compact)

[{"id":0,"name":"Hans","examine":"Servant of the Duke of    Lumbridge.","combat":0,"size":1,"attackable":false,"aggressive":false,"retreats":false,"poisonous":false,"respawn":10,"maxhit":0,"hp":0,"attackspeed":7,"attackanim":0,"defenceanim":0,"deathanim":0,"attackbonus":0,"defencemelee":0,"defencerange":0,"defencemage":0},{"id":1,"name":"Man","examine":"One of Wildy\u0027s many citizens.","combat":2,"size":1,"attackable":true,"aggressive":false,"retreats":true,"poisonous":false,"respawn":10,"maxhit":1,"hp":7,"attackspeed":7,"attackanim":422,"defenceanim":1834,"deathanim":836,"attackbonus":9,"defencemelee":9,"defencerange":9,"defencemage":0}] 

Вот как я загружаю json-файл.

/** 
* A dynamic method that allows the user to read and modify the parsed data. 
* 
* @param reader 
*   the reader for retrieving the parsed data. 
* @param builder 
*   the builder for retrieving the parsed data. 
*/ 
public abstract void load(JsonObject reader, Gson builder); 

/** 
* Loads the parsed data. How the data is loaded is defined by 
* {@link JsonLoader#load(JsonObject, Gson)}. 
* 
* @return the loader instance, for chaining. 
*/ 
public final JsonLoader load() { 
    try (FileReader in = new FileReader(Paths.get(path).toFile())) { 
     JsonParser parser = new JsonParser(); 
     JsonArray array = (JsonArray) parser.parse(in); 
     Gson builder = new GsonBuilder().create(); 

     for (int i = 0; i < array.size(); i++) { 
      JsonObject reader = (JsonObject) array.get(i); 
      load(reader, builder); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return this; 
} 

Любая помощь будет принята с благодарностью.

EDIT:

Вот исключение, был пойман.

java.lang.NullPointerException 
at NpcDefinitionLoader.load(NpcDefinitionLoader.java:28) 
at JsonLoader.load(JsonLoader.java:56) 
at NPCDefinitions.loadNPCDefinitions(NPCDefinitions.java:76) 
at DefinitionEditor.loadFile(DefinitionEditor.java:171) 
at DefinitionEditor.loadButtonActionPerformed(DefinitionEditor.java:790) 
at DefinitionEditor.actionPerformed(DefinitionEditor.java:827) 
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
at javax.swing.AbstractButton.doClick(Unknown Source) 
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source) 
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased 

Вот первая строка ошибки.

int maxHit = reader.get("maxHit").getAsInt(); 

Вторая ошибка линии

load(reader, builder); 
+0

Вы получаете исключение при попытке загрузить json назад? Поскольку это форматирование является просто визуальной вещью, это не мешает правильному анализу json. – jotadepicas

+0

Да, я опубликую исключение выше. – ZZZ

ответ

1

Ваши ключи объекта JSON спасаемых в нижнем регистре. JSON чувствителен к регистру.

В компактный файл имеет maxhit вместо maxHit. Проверьте свои NpcDefinitions, чтобы узнать, как объявляется это поле/свойство.

Довольно печать JSON с Gson может быть выполнена с помощью Gson.toJson (JsonElement, JsonWriter). В документах есть хороший пример отступов: https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/stream/JsonWriter.html

+0

Спасибо! Это была проблема. Также как я могу заставить json-файл использовать формат 3-х таблеток вместо компактного формата? – ZZZ

Смежные вопросы