解析HashMap Json .fromJson

时间:2017-04-14 22:33:57

标签: java android json libgdx hashmap

这可能是一个新手问题。我将我的.json解析成一个hashmap时遇到了麻烦我可以轻松地编写json文件,这就是我所知道的,它是正确编写的,但加载它时我得到了一个错误:

Caused by: java.lang.InstantiationException: java.lang.Class<com.johnny.gamerpg.inventoryController$Weapon> has no zero argument constructor
Caused by: com.badlogic.gdx.utils.SerializationException: Class cannot be created (non-static member class): com.johnny.gamerpg.inventoryController$Weapon
Caused by: com.badlogic.gdx.utils.reflect.ReflectionException: Could not instantiate instance of class: com.johnny.gamerpg.inventoryController$Weapon

我相信我确实有一个零构造函数,并且这些类设置正确,因为我使用它们来编写.json。

以下是这些课程。

public class item {
    public String name;
    public item() {}
}

public class Weapon extends item {
    int damageMin = 9;
    int damageMax = 15;
    int priceBuy = 1;
    int priceSell = 2;

    public Weapon() {}
}

public class Sword extends Weapon{

    public Sword() {}
}

public class Dagger extends Weapon{

    public Dagger() {}
}

private FileHandle file = Gdx.files.local("items.json");
private HashMap<String, item> items = new HashMap<String, item>();

private void load(){
    Json json = new Json();
    items = json.fromJson(HashMap.class, file);
}

我已经四处寻找并且没有发现任何类似的东西。所以这可能意味着我做一些愚蠢的事情!无论如何这里是Json文件即时阅读,感谢任何建议将是惊人的。

{
"SwordOfDeath": {
    "class": "com.johnny.gamerpg.inventoryController$Sword",
    "name": "Sword of Death",
    "damageMax": 15,
    "damageMin": 2,
    "priceBuy": 1,
    "priceSell": 2
},
"DaggerOfDeath": {
    "class": "com.johnny.gamerpg.inventoryController$Dagger",
    "name": "Dagger of Death",
    "damageMax": 15,
    "damageMin": 2,
    "priceBuy": 1,
    "priceSell": 2
}
}

谢谢!

编辑: 进口,     包com.johnny.gamerpg;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.utils.Json;
import com.badlogic.gdx.utils.JsonWriter;

import java.util.HashMap;

2 个答案:

答案 0 :(得分:1)

根据堆栈跟踪,WeaponinventoryController内的嵌套类。根据您的代码,它没有标记为static,而是标记为公共内部类。

这意味着需要实例化inventoryController才能实例化Weapon,这就是为什么你得到零参数构造函数异常的原因

顺便说一下,inventoryController应为InventoryController

声明它是静态的,你有它:)

答案 1 :(得分:1)

如果你仔细查看错误,你会发现他们引用了一个&#34; (non-static member class)&#34; - 将你的课程放在他们自己的文件中,它应该有效

你可以做的另一件事(如果你想使用GWT会对你有帮助)就是开始使用像ObjectMap这样的libGDX数据结构 - 它们似乎可以更好地与libGDX解析器配合使用,并且针对游戏进行了优化。 / p>

最后,看起来你似乎要为游戏中的每件武器创建课程 - 你可能想要考虑保留你的武器&#34;上课然后传递数据,使其变成剑或匕首或工作人员或AK47或其他什么。在软件开发中,我们称之为&#34; Composition over Inheritance&#34;。