有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Hashmap Json保存和加载

您好,今天我在解析和构建Json对象时遇到了一些困难。 对于初学者,我的主要HashMap如下:

 private HashMap<AchievementList, Integer> playerAchievements = new HashMap<AchievementList, Integer>(
            AchievementList.values().length) {
        {
            for (AchievementList achievement : AchievementList.values()) {
                put(achievement, 0);
            }
        }

        private static final long serialVersionUID = -4629357800141530574L;
    };

    public HashMap<AchievementList, Integer> getPlayerAchievements() {
        return playerAchievements;
    }

在我的PlayerSave文件中,我在这里构建了这个对象:在这个对象中有一些属性,比如名称passwoords和数组。我正在尝试将hashmap保存到此对象中

Path path = Paths.get("./data/saves/characters/", player.getUsername() + ".json");
        File file = path.toFile();
        file.getParentFile().setWritable(true);

        // Attempt to make the player save directory if it doesn't
        // exist.
        if (!file.getParentFile().exists()) {
            try {
                file.getParentFile().mkdirs();
            } catch (SecurityException e) {
                System.out.println("Unable to create directory for player data!");
            }
        }
        try (FileWriter writer = new FileWriter(file)) {

            Gson builder = new GsonBuilder().setPrettyPrinting().create();
            JsonObject object = new JsonObject();

这就是我试图做的,但没有成功。。。我无法将哈希映射正确地构建到。json文件

object.add("playerAchievements", builder.toJsonTree(player.getPlayerAchievements().values()));

在我的PlayerLoad文件中,我有一个基于玩家登录的对象。。假设它将我的hashmap加载到players当前数据中,该数据位于playerAchievents初始化的Player类中

private HashMap<AchievementList, Integer> playerAchievements


// Create the path and file objects.
        Path path = Paths.get("./data/saves/characters/", player.getUsername() + ".json");
        File file = path.toFile();

        // If the file doesn't exist, we're logging in for the first
        // time and can skip all of this.
        if (!file.exists()) {
            return LoginResponses.NEW_ACCOUNT;
        }

        // Now read the properties from the json parser.
        try (FileReader fileReader = new FileReader(file)) {
            JsonParser fileParser = new JsonParser();
            Gson builder = new GsonBuilder().create();
            JsonObject reader = (JsonObject) fileParser.parse(fileReader);

所以我这里的最终问题是,如何将Hashmap解析到jsonObject中。那我怎么把它装回去


共 (1) 个答案

  1. # 1 楼答案

    正如我在您的问题中发现的代码一样,您需要将对象序列化为json格式,然后将其从json反序列化为对象

    要做到这一点,您可以使用的最佳java库之一是GoogleGSON。以下是它的使用示例:

    public class Entity {
        String name, url;
        public Entity(String name, String url) {
                this.name = name;
                this.url = url;
        }
    }
    
    public class driver {
        Map<Entity, Integer> myMap = new HashMap<>();
        public static void main(String[] args) {
                Entity entity = new Entity("yooz search engine", "https://yooz.ir/");
                myMap.put(entity, 1);
    
                Gson gson  = new Gson();
                //serialization process
                String jsonFormat = gson.toJson(myMap);
                Files.write(Paths.get("pathToSave"), jsonFormat.getBytes());
    
                //deserialization process
                Entity entity1 = gson.fromJson(jsonFormat, Entity.class);
                System.out.println(entity1.name + " " + entity1.url);
        }
    }