java - Gson 不构造内部对象

标签 java json gson

我正在尝试使用 Gson 将 json 文件读入 java。为此,我使用了这一行:

data = gson.fromJson(json.toString(), MainData.class);

我认为它有效,因为我可以访问 MainData 中名为 version 的字段:

System.out.println(data.version);//<-- this works

但是一旦我尝试从内部对象检索数据,我就会收到 nullPointerException:

System.out.println(data.elemental.Water.a);//<-- this doens't work

我查看了很多看起来相同的问题。但据我所知,我正在做同样的事情。所以我的猜测是某处存在语法错误但我找不到它。这并不是不可想象的,因为这是我第一次尝试使用 json 和 gson。

这是我的 json 文件:

{
"version": "1.1.0",
"values": {
"game": {

},
"elemental": {
  "Air": {

  },
  "Void": {

  },
  "Earth": {

  },
  "Water": {
      "a": "10"
  },
  "Fire": {
    "tickTime": "10"

  }
}
}
}

这是我的 java 文件: 顺便说一句,我还注意到并非所有构造函数都被调用。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

import org.bukkit.craftbukkit.libs.com.google.gson.Gson;

public class JSONReader {

private static MainData data;

protected static final void readFile() throws IOException{
    BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(new File(Elementals.DataBase, "advanced.json"))));
    StringBuffer json = new StringBuffer();
    String line;
    while((line = reader.readLine()) != null){
        json.append(line);
    }
    System.out.println(json.toString());
    reader.close();
    Gson gson = new Gson();
    data = gson.fromJson(json.toString(), MainData.class);

    System.out.println(data.version);//works
    System.out.println(data.elemental.Water.a);//doesn't work
    System.out.println(data.elemental.Fire.tickTime);//doesn't work
}

private class MainData{
    MainData(){//is called
        System.out.println("main");
    }
    private String version;
    private GameData values;
    private ElementalData elemental;

    public class GameData{
        GameData(){//is not called
            System.out.println("gamedata");
        }
    }

    private class ElementalData{
        ElementalData(){//is not called
            System.out.println("elemental");
        }
        private AirData Air;
        private EarthData Earth;
        private WaterData Water;;
        private FireData Fire;
        private VoidData Void;

        private class AirData{

        }

        private class EarthData{

        }

        private class WaterData{
            WaterData(){//is not called
                System.out.println("Water");
            }
            private int a;
        }

        private class FireData{
            private int tickTime;
        }

        private class VoidData{

        }
    }
}
}

我希望这能提供足够的信息,我期待得到答案。

最佳答案

在 JSON 中,elemental 直接嵌套在 values 中,而不是嵌套在根对象中。您的 POJO 需要反射(reflect)这一点。你的类应该是这样的

public class GameData {
    GameData() {// is not called
        System.out.println("gamedata");
    }
    private ElementalData elemental; // instead of in MainData
}

然后

System.out.println(data.values.elemental.Water.a);

关于java - Gson 不构造内部对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25429237/

相关文章:

json - 在Play中自定义JSON序列化

java - 如何将日期格式转换为毫秒?

javascript - 渲染大型 HTML 页面

javascript - 根据其他输入填充输入

c# - 是否可以在 C# 中有一个名为 bool 的字段?

java - 如何将 JSON 字符串转换为 GSON 对象?

android - 使用 Retrofit 将动态 JSON 解析为 POJO

java - 为旧的 Java 编译器提供 Dummy-Annotation

java - 如果使用注释,如何使Maven构建失败?

java - 链接 Spring CookieLocaleResolver 和 AcceptHeaderLocaleResolver