在Unity和c#中使用基本JSON存在问题
本文关键字:JSON 存在 问题 Unity | 更新日期: 2023-09-27 18:07:30
我在Unity中使用JSON文件制作游戏库存物品列表。这很好,但现在我被一件看似简单的事情困住了。
我只是想改变一堆布尔/整数通过一个JSON文件加载它,所以玩家托管自己的服务器可以自定义它到自己的风格。
这是我以前的方法,它工作得很好。…只是我取出来的重复代码。
void SetInitialReferences()
{
itemData = JsonMapper.ToObject(File.ReadAllText(Application.dataPath + "/StreamingAssets/Items.json"));
ConstructItemDatabase();
}
public Item FetchItemByID(int id)
{
for( int i = 0; i < dataBase.Count; i++ )
if (dataBase[i].ItemID == id)
return dataBase[i];
return null;
}
void ConstructItemDatabase()
{
for (int i = 0; i < itemData.Count; i++)
{
dataBase.Add(new Item((int)itemData[i]["id"], ...........));
}
}
public class Item
{
public int ItemID { get; set; }
..........
public Item (int itemId...............)
{
this.ItemID = itemId;
............
}
现在是我的新代码,我不想把它放在列表中,因为我不需要多次访问它。
void Start()
{
serverData = JsonMapper.ToObject(File.ReadAllText(Application.dataPath + "/StreamingAssets/ServerData.json"));
ChangeServerOptions();
}
public void ChangeServerOptions()
{
this.treesRespawn = (bool)serverData["TreesRespawn"];
this.rocksRespawn = (bool)serverData["RocksRespawn"];
.
.
.
.
.
}
最后这是我的错误,我认为这是因为我使用了JsonMapper。是啊,但我不知道还有什么办法。
InvalidOperationException: Instance of JsonData is not a dictionary
LitJson.JsonData.EnsureDictionary ()
LitJson.JsonData.get_Item (System.String prop_name)
Overdose.GameManager_ServerOptions.ChangeServerOptions () (at Assets/Scripts/MasterScripts/GameManager_ServerOptions.cs:61)
Overdose.GameManager_ServerOptions.Start () (at Assets/Scripts/MasterScripts/GameManager_ServerOptions.cs:53)
我只需要允许那些不是程序员的人改变他们的服务器设置。
这是旧的JSON:
{
"id": 0,
"title": "G36c",
"description": "Primary Weapon. Automatic Rifle, uses 5.56 ammuntion.",
"value": 50000,
"maxQuantity": 1,
"maxSpecialQuantity" : 1,
"health": 100,
"type": "Weapon",
"secondType": "",
"specialType": "PrimaryWeapon",
"attachments": 6,
"smuggle": false,
"ammoType": "FiveAmmo",
"battery": false,
"fuel" : false,
"stackable": false,
"slug": "g36c"
},
新:和
{
//Resources
"TreesRespawn": true,
"RocksRespawn": true,
"MiscResourceRespawn": true,
.
.
.
.
.
.
我明白了。
syncSystemDate = (bool)serverData[0]["SyncSystemData"];
我没有意识到它被认为是一个数组,所以我必须添加[0]。这个问题困扰了我好几个小时,它看起来很简单,它是....