首先,我有一个课程'项目'在我的代码中有不同的字段,例如' id',' name',' isItem',int,string和boolean。我想创建一个创建一个'项目的功能。来自一个id。我想要这个函数来获取像Excel这样的数据库中的对象或者手动编辑的东西。
好的,然后我尝试了创建一个ItemsContainer类,如:
public class ItemsContainer : MonoBehaviour {
public item[] items;
}
然后我试着解析:
var json = System.IO.File.ReadAllText (Application.dataPath + "\\" + "json.txt");
ItemsContainer Items = JsonUtility.FromJson<ItemsContainer> (json);
Dictionary<int, item> its = new Dictionary<int, item> ();
its = Items.items.ToDictionary (x => x.id);
但它给了我Cannot deserialize JSON to new instances of type 'ItemsContainer.'
我不知道为什么。 Json是您输出的精确副本。在记事本......
JSON看起来像
{
"items": [
{
"id": 1,
"Name": "Wood",
"isItem": true
},
{
"id": 2,
"Name": "Stone",
"isItem": true
}
]
}
我的项目类定义为:
public class item : MonoBehaviour {
public int id;
public string Name;
public bool isItem;
public item () {
Name = "Nothing";
isItem = false;
}
}
答案 0 :(得分:2)
使用这样的配置数据时,最好的方法是将其保存为.json文件(它只是一个文本文件)并使用the JsonUtility
class。
如果设置JsonUtility.ToJson(yourClass, true)
,则第二个参数会打开“prettyPrint”,这样可以更容易地编辑记事本。只需通过代码制作一些“占位符”项目并调用.ToJson()
即可获取初始文件,然后您可以对其进行编辑并添加其余文件。
[Serializable]
public class MyItem
{
public int Id;
public string Name;
public bool isItem;
}
[Serializable]
public class ItemsContainer
{
public MyItem[] items;
}
//elsewhere
public void SaveTemplate()
{
List<MyItem> itemList = new List<MyItem>();
itemList.Add(new MyItem { Id = 1, Name = "Wood", isItem = true });
itemList.Add(new MyItem { Id = 2, Name = "Stone", isItem = true });
ItemsContainer itemsContainer= new ItemsContainer ();
itemsContainer.items = itemList.ToArray();
string json = JsonUtility.ToJson(itemsContainer, true);
YourFunctionToSaveTheTextSomewhere(json);
}
这将创建看起来类似于
的json文本{
"items": [
{
"Id": 1,
"Name": "Wood",
"isItem": true
},
{
"Id": 2,
"Name": "Stone",
"isItem": true
}
]
}
您可以编辑并添加更多项目,然后再回来
public MyItem[] GetItems()
{
string json = GetJsonTextSomehow();
ItemsContainer container = JsonUtility.FromJson<ItemsContainer>(json);
return container.items;
}
我设法获得了json文本,但是我如何调用id 45作为示例并根据其规范创建一个对象?
为此,您需要将数据加载到由项目ID键入的字典中,您的代码可能如下所示
public class ItemManager : MonoBehavior
{
private Dictionary<int, MyItem> _itemDict;
public void Awake()
{
var items = GetItems();
//Makes a new dictionary from the array using the field Id as the key.
_itemDict = items.ToDictionary(x => x.Id);
}
public MyItem GetItem(int itemId)
{
return _itemDict[itemId];
}
private MyItem[] GetItems()
{
string json = GetJsonTextSomehow();
ItemsContainer container = JsonUtility.FromJson<ItemsContainer>(json);
return container.items;
}
private string GetJsonTextSomehow()
{
//...
}
}