Json數據解析在Unity3d中的應用
最近做項目過程中因為Json文件名寫錯了一個字母Unity報錯,找錯誤找到半夜,當時為了驗錯,寫了一個小Demo,正好借此總結一下Json.
1.什么是Json
JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。它基於ECMAScript的一個子集。 JSON采用完全獨立於語言的文本格式,但是也使用了類似於C語言家族的習慣(包括C、C++、C#、Java、JavaScript、Perl、Python等)。這些特性使JSON成為理想的數據交換語言。 易於人閱讀和編寫,同時也易於機器解析和生成(一般用於提升網絡傳輸速率)。
2.JSON 語法規則
- 數據在鍵值對中
- 數據由逗號分隔
- 花括號保存對象
- 方括號保存數組
3.Json的結構
- 對象:對象在js中表示為“{}”括起來的內容,數據結構為 {key:value,key:value,...}的鍵值對的結構,在面向對象的語言中,key為對象的屬性,value為對應的屬性值,所以很容易理解,取值方法為 對象.key 獲取屬性值,這個屬性值的類型可以是 數字、字符串、數組、對象幾種。
- 數組:數組在js中是中括號“[]”括起來的內容,數據結構為 ["java","javascript","vb",...],取值方式和所有語言中一樣,使用索引獲取,字段值的類型可以是 數字、字符串、數組、對象幾種。
4.Json在Unity3d中的使用
-
JsonUtility:JsonUtility是Untiy5.3后新增的內容,有時會出現莫名其妙的錯誤:
JsonUtility.FromJson():把json字符串轉成對象.
JsonUtility.ToJson():把對象轉成json字符串. -
LitJson:LitJson是一個Json的開源項目,這個比較穩定,推薦使用:
JsonMapper.ToObject():把json字符串轉成對象.
JsonMapper.ToJson():把對象轉成json字符串.
官網下載:http://www.json.org/json-zh.html
放到Unity3d中的Plugin文件夾內
使用的話要注意引入命名空間
5.上代碼:
純數組的Json數據比較簡單,在這個Demo中Json數據是一個對象,對象內有一個數組.分別需要用到一個Json對象模型(JsonObjectModel)和一個Json數組模型(JsonArrayModel)來接收這兩種Json數據:
- Json源文件
{
"infoList": [
{
"panelTypeString": "ItemMessage",
"path": "UIPanel/ItemMessagePanel"
},
{
"panelTypeString": "Knapsack",
"path": "UIPanel/KnapsackPanel"
},
{
"panelTypeString": "MainMenu",
"path": "UIPanel/MainMenuPanel"
},
{
"panelTypeString": "Shop",
"path": "UIPanel/ShopPanel"
},
{
"panelTypeString": "Skill",
"path": "UIPanel/SkillPanel"
},
{
"panelTypeString": "System",
"path": "UIPanel/SystemPanel"
},
{
"panelTypeString": "Task",
"path": "UIPanel/TaskPanel"
}
]
}
- JsonObjectModel:Json對象模型
public class JsonObjectModel
{
//JsonArrayModel類型的列表
public List<JsonArrayModel> infoList;
}
- JsonArrayModel:Json數組模型
public class JsonArrayModel
{
//對應Json中屬性 名字要一樣
public string panelTypeString;
public string path;
}
- JsonDeserialize:Json解析程序,掛在場景中JsonManager上
public class JsonDeserialize : MonoBehaviour
{
void Start( )
{
//獲取Json文件
TextAsset jsonData = Resources.Load<TextAsset>("JsonData");
JsonObjectModel jsonObject = JsonMapper.ToObject<JsonObjectModel>(jsonData.text);
foreach (var info in jsonObject.infoList)
{
Debug.Log(info.panelTypeString+" "+info.path);
}
}
}
- 輸出結果: