当前位置: 首页 > 知识库问答 >
问题:

当列表中不存在字符串ist时更新Json文件

和飞翔
2023-03-14

我正在用Java编写一个Discord Giveway机器人。我正在将赠品的所有细节保存到一个JSON文件中。现在我想读取条目列表,如果用户ID不在列表中,我想添加它并保存文件。

以下是赠品课程:

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

打印后,文件如下所示:

{
  "time": 0,
  "entries": [
    "695629580014321747"
  ]
}

当我再次点击按钮时,它看起来像这样:

{
  "time": 0,
  "entries": [
    "\"695629580014321747\"",
    "695629580014321747"
  ]
}

那么,为什么我的IF条件不起作用呢?

共有1个答案

终育
2023-03-14

您正在使用entrie。toString()提供用于控制台输出的字符串。您应该使用entrie。改为getAsString()

此外,您还在JsonParser中使用了许多不推荐使用的东西,这些东西应该被替换<代码>新建JsonParser()。解析(…)应替换为JsonParser。解析器读取器(…)

最重要的是,强烈建议为此类任务使用数据库。像SQLite或Redis这样的东西在处理并发更改和冗余方面会更好。或者,至少,您应该为您的读者使用一次资源尝试。

try (Reader reader = ...) {
  JsonElement json = JsonParser.parseReader(reader).getAsJsonObject();
  ...
}

 类似资料:
  • 我有超过15个字符串列表,每个列表包含几个不同的代码。每个列表包含一种特定类型的代码。我有一个输入代码,必须找出该输入代码属于哪个列表,并根据结果返回一个特定字符串。我用if,else if来做这个。下面是示例代码 每个列表如下所示:公共静态列表codeTypeOneList=新ArrayList(); (其他代码类型的类似列表) 有没有更好的方法来实现这一点?谢谢

  • 背景故事: 我需要根据我制作的字母表来排列单词。 我之前做了大量的循环,但我从之前问题的答案中得到了一个想法,可以像这样映射它: 所以词会变,苹果会变成苹果--- 这似乎覆盖了所有字符,因此输出为: 我的大脑今天很模糊,我想我可以一直坚持到最后,直到找到某种解决方案,但这似乎不是一种有效的方法。有什么想法吗? 此时,我从列表中提取一个单词,将其放入一个字符数组中,这样我就可以分别更改每个字符,然后

  • 当我使用户名为公共时为什么会出错:

  • 我必须创建以下程序: 创建一个允许您键入名称的程序。用户键入并提交(使用enter键)的名称应存储在arraylist中。然后,arraylist中的名称应打印在屏幕上。 我的问题是,我只能在我的数组列表中存储一个名字。 我的代码: 第一个问题是,在键入一个名称并提交后,您不能键入任何内容,因此我必须重置输入,如使用整数值:

  • 问题内容: 我正在寻找一种在字符串中查找JSON数据的方法。像wordpress简码一样思考它。我认为最好的方法是使用正则表达式。我不想解析JSON,只需查找所有出现的事件。 正则表达式中是否有办法使括号的数量匹配?目前,当我嵌套对象时遇到了这个问题。 演示的快速示例: 结果,我想要两个JSON字符串。谢谢! 问题答案: 从给定的文本中提取JSON字符串 由于您正在寻找一种简单的解决方案,因此可以

  • 下面是我的JSON: 我想用下面的规则更新上述JSON字符串的两个属性: 标志:我想盲目地将此属性更新为。 infoFlag:如果< code>info的< code>name属性为< code>null,那么我希望将< code>infoFlag更新为< code>true否则为< code>false,如果它为< code>not null。 因此,在用这些规则更新JSON之后,我希望将JSO