2017-04-14 81 views
0

這可能是一個新手問題。我無法用我的解析成以.json一個HashMap我可以輕鬆地編寫JSON文件這是我怎麼知道它是正確寫入,但加載它在即時得到一個錯誤:解析HashMap Json .fromJson

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 
} 
} 

謝謝!

編輯: 進口, package 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; 
+0

你能顯示你的進口報表嗎? – John

+0

@John **更新!** – johnnyboy5566

+0

而且你的java類都在同一個文件或單獨的文件? – John

回答

1

如果你仔細看看錯誤,你會發現他們指的是「(non-static member class)」 - 把你的類放在他們自己的文件,它應該工作。

你可以做的另一件事(如果你想使用GWT,它可以幫助你)開始使用libGDX數據結構,如ObjectMap - 它們似乎更適合於libGDX分析器,並針對遊戲進行了優化。

最後,它看起來就像是要爲遊戲中的每種武器創建類 - 您可能需要考慮保留「武器」類,然後將數據傳遞給劍或匕首或工作人員,或者AK47或其他。在軟件開發中,我們稱之爲「Composition over Inheritance」。

+0

我要爲每個**不同的**類型的武器做一個類! – johnnyboy5566

1

根據棧跟蹤,Weapon是內部inventoryController嵌套類。根據你的代碼,它沒有標記爲static,而是作爲公共內部類。

這意味着,inventoryController需求,以實例化實例Weapon,這就是爲什麼你得到的是零PARAM構造異常

順便說一句,inventoryControllerInventoryController

聲明爲靜態並在那裏你:)

+0

這也是一個完全有效的**答案**。我剛剛使用了@約翰,因爲他已經和我一起工作了,而且我喜歡把文件拆分的想法! – johnnyboy5566

+0

@ johnnyboy5566好的:)另一個咬人的灰塵,我猜:) – Sheinbergon