Mod de lucru încorporat cu JSON în Unity Code
JSON (JavaScript Object Notation) este un format de schimb de date utilizat pe scară largă, iar integrarea acestuia în Unity poate fi puternică pentru gestionarea configurațiilor, salvarea progresului jocului sau schimbul de date cu servicii externe. Acest ghid vă prezintă elementele fundamentale ale lucrului cu JSON în Unity.
Pasul 1: înțelegerea JSON
JSON este format din perechi cheie-valoare și structuri imbricate.
Pasul 2: Lucrul cu JSON în codul Unity
Unity simplifică serializarea și deserializarea JSON prin clasa sa 'JsonUtility'. Acest ghid demonstrează pașii de bază pentru a lucra cu JSON în Unity fără biblioteci externe.
- Creați o structură JSON:
{
"playerName": "John Doe",
"playerLevel": 5,
"inventory": ["sword", "shield"]
}
- Serializare - Conversia obiectului C# în JSON:
using UnityEngine;
[System.Serializable]
public class PlayerData
{
public string playerName;
public int playerLevel;
public string[] inventory;
}
public class SerializationExample : MonoBehaviour
{
void Start()
{
PlayerData playerData = new PlayerData
{
playerName = "John Doe",
playerLevel = 5,
inventory = new string[] { "sword", "shield" }
};
string json = JsonUtility.ToJson(playerData);
Debug.Log(json);
}
}
- Deserializare - Conversia JSON în obiect C#:
using UnityEngine;
[System.Serializable]
public class PlayerData
{
public string playerName;
public int playerLevel;
public string[] inventory;
}
public class DeserializationExample : MonoBehaviour
{
void Start()
{
string jsonData = "{\"playerName\":\"John Doe\",\"playerLevel\":5,\"inventory\":[\"sword\",\"shield\"]}";
PlayerData playerData = JsonUtility.FromJson<PlayerData>(jsonData);
Debug.Log($"Name: {playerData.playerName}, Level: {playerData.playerLevel}");
Debug.Log("Inventory: " + string.Join(", ", playerData.inventory));
}
}
Limitări cunoscute
'JsonUtility' nu acceptă direct serializarea și deserializarea matricelor de nivel superior de obiecte (de exemplu, '[{},{},{}]') fără o clasă de împachetare. Pentru a rezolva acest lucru, puteți folosi o clasă de ajutor pentru a încheia matricea. Iată un exemplu:
using UnityEngine;
[System.Serializable]
public class PlayerData
{
public string playerName;
public int playerLevel;
}
[System.Serializable]
public class PlayerDataArrayWrapper
{
public PlayerData[] players;
}
public class TopLevelArrayExample : MonoBehaviour
{
void Start()
{
// Serialization: Converting C# Object Array to JSON
PlayerData[] players = new PlayerData[]
{
new PlayerData { playerName = "John Doe", playerLevel = 5 },
new PlayerData { playerName = "Jane Smith", playerLevel = 8 }
};
PlayerDataArrayWrapper wrapper = new PlayerDataArrayWrapper { players = players };
string json = JsonUtility.ToJson(wrapper);
Debug.Log(json);
// Deserialization: Converting JSON to C# Object Array
string jsonData = "{\"players\":[{\"playerName\":\"John Doe\",\"playerLevel\":5},{\"playerName\":\"Jane Smith\",\"playerLevel\":8}]}";
PlayerDataArrayWrapper deserializedData = JsonUtility.FromJson<PlayerDataArrayWrapper>(jsonData);
foreach (var player in deserializedData.players)
{
Debug.Log($"Name: {player.playerName}, Level: {player.playerLevel}");
}
}
}
În exemplul de mai sus, clasa 'PlayerDataArrayWrapper' este utilizată pentru a încheia matricea la serializare și deserializare. Este o practică obișnuită să creați astfel de clase wrapper atunci când aveți de-a face cu matrice de nivel superior de obiecte în 'JsonUtility'.
Concluzie
'JsonUtility' simplifică serializarea și deserializarea JSON direct fără biblioteci externe. Utilizați această abordare nativă pentru operațiuni JSON simple în proiecte Unity.