gpt4 book ai didi

java - 如何编写特定格式的json文件?

转载 作者:行者123 更新时间:2023-12-02 08:51:11 25 4
gpt4 key购买 nike

我的程序即将完成,它加载完美,但我遇到的一个问题是,当我通过程序编辑 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个空格制表符)

    [
{
"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 文件后的格式。 (紧凑)

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

如有任何帮助,我们将不胜感激。

编辑:

这是捕获的异常。

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

最佳答案

您的 JSON 对象键将以小写形式保存。 JSON 区分大小写。

在压缩文件中,它具有 ma​​xhit 而不是 ma​​xHit。检查您的 NpcDefinitions 以查看该字段/属性的声明方式。

可以使用 Gson.toJson(JsonElement, JsonWriter) 来使用 Gson 漂亮地打印 JSON。这里的文档中有一个很好的缩进示例: https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/stream/JsonWriter.html

关于java - 如何编写特定格式的json文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31099872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com