以适当的方式将json数据映射到java对象-LibGdx

时间:2017-07-07 06:35:01

标签: libgdx

我正在进行一场无休止的水平比赛。我想为第一级设置障碍。我想用json做,但有困难,因为我第一次尝试json解析。

我创建了一个像这样的json文件:

{
"screen1":
[
{"name":"rock","position":"middle","distance":"400","speed":"0"}
],
"screen2":  
[
      {"name":"snake","position":"up","distance":"100","speed":"0"},
      {"name":"watersnake","position":"up","distance":"800","speed":"0"}
],
"screen3":
 [
      {"name":"rock","position":"middle","distance":"400","speed":"0"},
      {"name":"gorilla","position":"middle","distance":"500","speed ":"0"},
      {"name":"crow","position":"up","distance":"200","speed":"0"}

],

"screen4":
[
    {"name":"crocodile","position":"up","distance":"600","speed":"0"},
    {"name":"gap","position":"up","distance":"700","speed":"0"},
    {"name":"cloud","position":"up","distance":"300","speed":"0"}

],
"screen5":
[
{"name":"gorilla","position":"middle","distance":"500","speed ":"0"}
]
}

实际上我将整个移动背景划分为5个屏幕。对于每个屏幕,我想放置json文件中指定的障碍物。

为此,我想将解析后的json映射到java对象。

所以我创建了一个这样的方法来解析:

 public void loadLevelJson(String fileName,String entryName)
{
        JsonValue jsonValue = new JsonReader().parse(Gdx.files.internal(fileName));
        JsonValue objList = jsonValue.get(entryName);
            //  System.out.println("name:" + objList);
                if (entryName.equals("screen2")){
                    System.out.println("____________"+entryName);
                for(JsonValue value : objList.iterator())
                {
                      if(value.getString("name").equals("rock"))
                      {
                          rockSpeed=value.getFloat("speed");
                          rockpos=value.getString("position");
                          rockX=value.getFloat("distance");

                          if(value.getString("position").equals("middle"))
                              rockY=Constants.BIG_ROCK_Y;
                      }

                      if(value.getString("name").equals("snake"))
                      {
                          snakeSpeed=value.getFloat("speed");
                          snakePos=value.getString("position");
                          snakeX=value.getFloat("distance");
                          if(value.getString("position").equals("up"))
                              snakeY=Constants.SNAKE_Y;
                      }
                      if(value.getString("name").equals("watersnake"))
                      {
                          w_snakeSpeed=value.getFloat("speed");
                          w_snakePos=value.getString("position");
                          w_snakeX=value.getFloat("distance");
                          if(value.getString("position").equals("down"))
                              w_snakeY=Constants.W_SNAKE_Y;
                      }
                      if(value.getString("name").equals("gorilla"))
                      {
                          gorillaSpeed=value.getFloat("speed");
                          gorillaPos=value.getString("position");
                          gorillaX=value.getFloat("distance");
                          if(value.getString("position").equals("middle"))
                              gorillaY=Constants.GORILLA_Y;
                      }
                      if(value.getString("name").equals("crow"))
                      {
                          crowSpeed=value.getFloat("speed");
                          crowPos=value.getString("position");
                          crowX=value.getFloat("distance");
                          if(value.getString("position").equals("up"))
                              crowY=Constants.CROW_Y;
                      }

                      if(value.getString("name").equals("gap"))
                      {
                          gapSpeed=value.getFloat("speed");
                          gapPos=value.getString("position");
                          gapX=value.getFloat("distance");
                          if(value.getString("position").equals("down"))
                              gapY=Constants.GAP_Y;
                      }
                      if(value.getString("name").equals("cloud"))
                      {
                          cloudSpeed=value.getFloat("speed");
                          cloudPos=value.getString("position");
                          cloudX=value.getFloat("distance");
                          if(value.getString("position").equals("up"))
                              cloudY=Constants.CLOUD_Y;
                      }
                      if(value.getString("name").equals("cloud"))
                      {
                          crocodileSpeed=value.getFloat("speed");
                          crocodilePos=value.getString("position");
                          crocodileX=value.getFloat("distance");
                          if(value.getString("position").equals("down"))
                              crocodileY=Constants.CROCODILE_Y;
                      }
                }
}

}

但是我真的很难解决如何用每个屏幕解析这些东西以及映射到屏幕和创建的对象类的障碍。完全混淆因为我第一次使用json。

如果有人提出一些想法继续下去会非常有帮助。

提前致谢。

1 个答案:

答案 0 :(得分:0)

有许多不同的方法可以实现这一目标。也许使用java集合对libgdx json进行一些研究。您最终如何构建代码取决于您自己。我们不知道您的代码的详细信息或您将如何使用这些数据。

也许开始更简单,让事情变得有效,然后一旦你感觉舒服就从那里扩展。或许可以将每个屏幕上的json障碍分解为单个文件。你剩下的就是(只是一个例子)利用List接口。

再一次,作为一个例子,如果你有一个Obstacle类(所有代码只是信息性的,甚至不知道它是否编译)

pulic class Obstacle {

    private String name;
    private String position;
    private int distance;
    private int speed;
}

使用它来为一个关卡中的每个障碍物实例化一个对象。然后无论你在哪里进行json解析/需要障碍,都要像

那样
...
//fileName contains only obstacles for one screen, not all of them
ArrayList<Obstacle> obstacles = json.fromJson(ArrayList.class, Obstacle.class, Gdx.files.internal(fileName));

这会为你提供一个特定级别的障碍物阵列列表,但你如何使用它取决于你。就像我上面说的那样,许多不同的选择,但你必须根据你的要求定制。使用Map接口可能更有意义,例如,使用障碍物名称作为键(或者可能不是 - 取决于您)。为一次加载的所有屏幕设置所有障碍可能会使列表列表(或地图列表等...)。更复杂,但是如果你完成了上述工作,那么你可以使用不断增加的复杂性和重构来满足你的需求。

同样,只需在头顶输入上面的内容,所以语法可能稍微偏离。

修改以添加

在您的一些评论之后更新:正如我上面所说,有很多方法可以解决这个问题,这取决于您的数据以及您希望如何使用它。 Collections Framework应该为您提供所需的一切,并使用我为json提供的示例,您应该能够从文件中解析。你拥有的“嵌套”越多,json越复杂。因此,为什么我建议开始放慢速度,或者将屏障障碍打入每个班级。

如果您已经为障碍物创建了类,那么我原始答案中的json会自动将其读入ArrayList中。每个障碍列表中的一个元素。

(同样,所有这些代码都在我的脑海中,可能有语法错误)

另一种选择可能是使用Map接口,也许是HashMap。使用“name”作为键,值将是障碍物对象(不需要在对象中包含名称)。像

这样的东西
Map<Obstacle> obstacles = new HashMap<String, Obstacle>(). 

现在要获得个别障碍,您可以访问地图,按名称询问障碍物,然后您将获得障碍类(阅读集合框架API)。

您当然可以将障碍物嵌入另一个代表您的屏幕的集合中。像

这样的东西
List<HashMap<String, Obstacle>> screenObstacles = new ....  

因此,如果你一次看到你的json障碍物(就像在我的原始例子中那样)变成变量aVar,你应该可以做到

screenObstacles.add(aVar);

然后根据需要进行检索。

Map<Obstacle> obstacles = screenObstacles.get(screenNumber); //screenNumber is screen you are on, ex 0/1/2/...
Obstacle obstacle = obstacles.get(GORILLA_NAME); // GORILLA_NAME is a string "gorilla"

//or loop through all obstacles for a given screen and do something with them

for (Obstacle obstacle : obstacles) {
    //something amazing goes here
}