当字符串不在列表中时更新 Json 文件
Updating Json file when String ist not present in list
我正在用 Java 编写一个 Discord 赠品机器人。我将赠品的所有详细信息保存到 JSON 文件中。现在我想读取条目列表,如果用户 ID 不在列表中,我想添加它并保存文件。
这是赠品 Class:
public class Giveaway {
private String prize;
private long time;
private Integer winners;
private List<String> entries;
public Giveaway(String prize, Integer winners, long time, List<String> entries) {
this.prize = prize;
this.winners = winners;
this.time = time;
this.entries = entries;
}
public Giveaway() {}
public String getPrize() {
return prize;
}
public void setPrize(String prize) {
this.prize = prize;
}
public long getTime() {
return time;
}
public void setTime(long time) {
this.time = time;
}
public Integer getWinners() {
return winners;
}
public void setWinners(Integer winners) {
this.winners = winners;
}
public List<String> getEntries() {
return entries;
}
public void setEntries(List<String> entries) {
this.entries = entries;
}
}
创建 GW 后,JSON 如下所示:
{
"prize": "Discord Nitro",
"time": 1641732935,
"winners": 2,
"entries": []
}
然后当用户单击一个按钮时,它应该读取列表以查看 ID 是否在列表中,如果不在列表中则添加该 ID。但是当我保存列表时,整个 JSON 文件都发生了变化。
我是如何读出并保存的:
public class ButtonClick extends ListenerAdapter {
private static Reader reader;
private static Giveaway giveaway = new Giveaway();
public void onButtonClick(ButtonClickEvent event) {
event.deferEdit().queue();
try {
reader = Files.newBufferedReader(Path.of(GiveawayStats.getGiveawayStats().getAbsolutePath()));
} catch (IOException e) {
e.printStackTrace();
}
if (event.getButton().getId().equals("gwEnter")) {
JsonParser parser = new JsonParser();
JsonObject obj = parser.parse(reader).getAsJsonObject();
JsonArray jsonEntries = obj.get("entries").getAsJsonArray();
long time = obj.get("time").getAsLong();
List<String> entries = new ArrayList<>();
for (JsonElement entrie : jsonEntries) {
entries.add(entrie.toString());
}
if (entries.contains(event.getMember().getId())) {
event.getChannel().sendMessage("Already in!").queue();
} else {
entries.add(event.getUser().getId().strip());
printToJson(entries);
}
}
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void printToJson(List<String> entries) {
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setVersion(2.0);
Gson gson = gsonBuilder.setPrettyPrinting().create();
giveaway.setEntries(entries);
try (Writer writer = new FileWriter(GiveawayStats.getGiveawayStats().getPath())) {
gson.toJson(giveaway, writer);
} catch (IOException e) {
e.printStackTrace();
}
}
}
打印后 JSON 文件如下所示:
{
"time": 0,
"entries": [
"695629580014321747"
]
}
当我再次点击按钮时,它看起来像这样:
{
"time": 0,
"entries": [
"\"695629580014321747\"",
"695629580014321747"
]
}
那么为什么我的 IF 条件不起作用?
您正在使用 entrie.toString()
,它会为您提供用于控制台输出的字符串。您应该改用 entrie.getAsString()
。
此外,您还在 JsonParser
中使用了很多不推荐使用的东西,应该将其替换。 new JsonParser().parse(...)
应替换为 JsonParser.parseReader(...)
。
最重要的是,强烈建议使用数据库来完成此类任务。 SQLite 或 Redis 之类的东西在处理并发更改和冗余方面会更好。或者至少,您应该为 reader.
使用 try-with-resources
try (Reader reader = ...) {
JsonElement json = JsonParser.parseReader(reader).getAsJsonObject();
...
}
我正在用 Java 编写一个 Discord 赠品机器人。我将赠品的所有详细信息保存到 JSON 文件中。现在我想读取条目列表,如果用户 ID 不在列表中,我想添加它并保存文件。
这是赠品 Class:
public class Giveaway {
private String prize;
private long time;
private Integer winners;
private List<String> entries;
public Giveaway(String prize, Integer winners, long time, List<String> entries) {
this.prize = prize;
this.winners = winners;
this.time = time;
this.entries = entries;
}
public Giveaway() {}
public String getPrize() {
return prize;
}
public void setPrize(String prize) {
this.prize = prize;
}
public long getTime() {
return time;
}
public void setTime(long time) {
this.time = time;
}
public Integer getWinners() {
return winners;
}
public void setWinners(Integer winners) {
this.winners = winners;
}
public List<String> getEntries() {
return entries;
}
public void setEntries(List<String> entries) {
this.entries = entries;
}
}
创建 GW 后,JSON 如下所示:
{
"prize": "Discord Nitro",
"time": 1641732935,
"winners": 2,
"entries": []
}
然后当用户单击一个按钮时,它应该读取列表以查看 ID 是否在列表中,如果不在列表中则添加该 ID。但是当我保存列表时,整个 JSON 文件都发生了变化。
我是如何读出并保存的:
public class ButtonClick extends ListenerAdapter {
private static Reader reader;
private static Giveaway giveaway = new Giveaway();
public void onButtonClick(ButtonClickEvent event) {
event.deferEdit().queue();
try {
reader = Files.newBufferedReader(Path.of(GiveawayStats.getGiveawayStats().getAbsolutePath()));
} catch (IOException e) {
e.printStackTrace();
}
if (event.getButton().getId().equals("gwEnter")) {
JsonParser parser = new JsonParser();
JsonObject obj = parser.parse(reader).getAsJsonObject();
JsonArray jsonEntries = obj.get("entries").getAsJsonArray();
long time = obj.get("time").getAsLong();
List<String> entries = new ArrayList<>();
for (JsonElement entrie : jsonEntries) {
entries.add(entrie.toString());
}
if (entries.contains(event.getMember().getId())) {
event.getChannel().sendMessage("Already in!").queue();
} else {
entries.add(event.getUser().getId().strip());
printToJson(entries);
}
}
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void printToJson(List<String> entries) {
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setVersion(2.0);
Gson gson = gsonBuilder.setPrettyPrinting().create();
giveaway.setEntries(entries);
try (Writer writer = new FileWriter(GiveawayStats.getGiveawayStats().getPath())) {
gson.toJson(giveaway, writer);
} catch (IOException e) {
e.printStackTrace();
}
}
}
打印后 JSON 文件如下所示:
{
"time": 0,
"entries": [
"695629580014321747"
]
}
当我再次点击按钮时,它看起来像这样:
{
"time": 0,
"entries": [
"\"695629580014321747\"",
"695629580014321747"
]
}
那么为什么我的 IF 条件不起作用?
您正在使用 entrie.toString()
,它会为您提供用于控制台输出的字符串。您应该改用 entrie.getAsString()
。
此外,您还在 JsonParser
中使用了很多不推荐使用的东西,应该将其替换。 new JsonParser().parse(...)
应替换为 JsonParser.parseReader(...)
。
最重要的是,强烈建议使用数据库来完成此类任务。 SQLite 或 Redis 之类的东西在处理并发更改和冗余方面会更好。或者至少,您应该为 reader.
使用 try-with-resourcestry (Reader reader = ...) {
JsonElement json = JsonParser.parseReader(reader).getAsJsonObject();
...
}