Gson没有构建内部对象

时间:2014-08-21 14:39:59

标签: 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{

        }
    }
}
}

我希望这足以提供足够的信息,我期待着回答。

1 个答案:

答案 0 :(得分:1)

在您的JSON中,您的elemental直接嵌套在values中,而不是嵌入在根对象中。您的POJO需要反映这一点。你的课应该是这样的

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