5.3.3 अपडेट के बाद एकता ने अपने एपीआई में JsonUtility को जोड़ा । जब तक आप कुछ अधिक जटिल नहीं कर रहे हैं, सभी 3 पार्टी पुस्तकालयों के बारे में भूल जाएं। JsonUtility अन्य Json पुस्तकालयों की तुलना में तेज है। एकता 5.3.3 संस्करण या इसके बाद के संस्करण के लिए अद्यतन करें फिर नीचे दिए गए समाधान का प्रयास करें।
JsonUtility
एक हल्का एपीआई है। केवल सरल प्रकार समर्थित हैं। यह शब्दकोश जैसे संग्रह का समर्थन नहीं करता है । एक अपवाद है List
। यह समर्थन List
और List
सरणी!
अगर आपको Dictionary
सिंपल सीरियलाइज़ करने और सिंपल डिटैटेप्स को डिसरसाइज़ करने के अलावा कुछ और करने की ज़रूरत है, तो थर्ड-पार्टी एपीआई का इस्तेमाल करें। अन्यथा, पढ़ना जारी रखें।
क्रमबद्ध करने के लिए उदाहरण वर्ग:
[Serializable]
public class Player
{
public string playerId;
public string playerLoc;
public string playerNick;
}
1. वन डेटा (नॉन-एआरआरवाई जॉन्सन)
भाग एक को क्रमबद्ध करना :
public static string ToJson(object obj);
विधि के साथ Json के लिए सीरियल करें ।
Player playerInstance = new Player();
playerInstance.playerId = "8484239823";
playerInstance.playerLoc = "Powai";
playerInstance.playerNick = "Random Nick";
//Convert to JSON
string playerToJson = JsonUtility.ToJson(playerInstance);
Debug.Log(playerToJson);
आउटपुट :
{"playerId":"8484239823","playerLoc":"Powai","playerNick":"Random Nick"}
पार्ट बी को सीरियलाइज़ करना :
public static string ToJson(object obj, bool prettyPrint);
विधि अधिभार के साथ Json के लिए सीरियल करें । बस फंक्शन में जाने true
से JsonUtility.ToJson
डेटा फॉर्मेट हो जाएगा। ऊपर दिए गए आउटपुट की तुलना नीचे के आउटपुट से करें।
Player playerInstance = new Player();
playerInstance.playerId = "8484239823";
playerInstance.playerLoc = "Powai";
playerInstance.playerNick = "Random Nick";
//Convert to JSON
string playerToJson = JsonUtility.ToJson(playerInstance, true);
Debug.Log(playerToJson);
आउटपुट :
{
"playerId": "8484239823",
"playerLoc": "Powai",
"playerNick": "Random Nick"
}
भाग एक का वर्णन :
public static T FromJson(string json);
विधि अधिभार के साथ जर्स का वर्णन करें ।
string jsonString = "{\"playerId\":\"8484239823\",\"playerLoc\":\"Powai\",\"playerNick\":\"Random Nick\"}";
Player player = JsonUtility.FromJson<Player>(jsonString);
Debug.Log(player.playerLoc);
Deserializing भाग B :
public static object FromJson(string json, Type type);
विधि अधिभार के साथ जर्स का वर्णन करें ।
string jsonString = "{\"playerId\":\"8484239823\",\"playerLoc\":\"Powai\",\"playerNick\":\"Random Nick\"}";
Player player = (Player)JsonUtility.FromJson(jsonString, typeof(Player));
Debug.Log(player.playerLoc);
भाग सी का वर्णन :
Deserialize साथ json public static void FromJsonOverwrite(string json, object objectToOverwrite);
विधि। जब JsonUtility.FromJsonOverwrite
उपयोग किया जाता है, तो उस वस्तु का कोई नया उदाहरण नहीं है जिसे आप बनाने के लिए इच्छुक हैं। यह आपके द्वारा पास किए गए उदाहरण को पुनः उपयोग करेगा और इसके मूल्यों को अधिलेखित करेगा।
यह कुशल है और यदि संभव हो तो इसका उपयोग किया जाना चाहिए।
Player playerInstance;
void Start()
{
//Must create instance once
playerInstance = new Player();
deserialize();
}
void deserialize()
{
string jsonString = "{\"playerId\":\"8484239823\",\"playerLoc\":\"Powai\",\"playerNick\":\"Random Nick\"}";
//Overwrite the values in the existing class instance "playerInstance". Less memory Allocation
JsonUtility.FromJsonOverwrite(jsonString, playerInstance);
Debug.Log(playerInstance.playerLoc);
}
2. मल्टीपल डेटा (ARRAY JSON)
आपके Json में कई डेटा ऑब्जेक्ट हैं। उदाहरण के लिए एकplayerId
से अधिक बार दिखाई दिया । यूनिटी JsonUtility
सरणी का समर्थन नहीं करता है क्योंकि यह अभी भी नया है लेकिन आप इस व्यक्ति से सहायक वर्ग का उपयोग कर सकते हैं जिससे सरणी काम कर सके JsonUtility
।
नामक एक क्लास बनाएं JsonHelper
। नीचे से सीधे JsonHelper की प्रतिलिपि बनाएँ।
public static class JsonHelper
{
public static T[] FromJson<T>(string json)
{
Wrapper<T> wrapper = JsonUtility.FromJson<Wrapper<T>>(json);
return wrapper.Items;
}
public static string ToJson<T>(T[] array)
{
Wrapper<T> wrapper = new Wrapper<T>();
wrapper.Items = array;
return JsonUtility.ToJson(wrapper);
}
public static string ToJson<T>(T[] array, bool prettyPrint)
{
Wrapper<T> wrapper = new Wrapper<T>();
wrapper.Items = array;
return JsonUtility.ToJson(wrapper, prettyPrint);
}
[Serializable]
private class Wrapper<T>
{
public T[] Items;
}
}
सीरियल एरिंग जसन ऐरे :
Player[] playerInstance = new Player[2];
playerInstance[0] = new Player();
playerInstance[0].playerId = "8484239823";
playerInstance[0].playerLoc = "Powai";
playerInstance[0].playerNick = "Random Nick";
playerInstance[1] = new Player();
playerInstance[1].playerId = "512343283";
playerInstance[1].playerLoc = "User2";
playerInstance[1].playerNick = "Rand Nick 2";
//Convert to JSON
string playerToJson = JsonHelper.ToJson(playerInstance, true);
Debug.Log(playerToJson);
आउटपुट :
{
"Items": [
{
"playerId": "8484239823",
"playerLoc": "Powai",
"playerNick": "Random Nick"
},
{
"playerId": "512343283",
"playerLoc": "User2",
"playerNick": "Rand Nick 2"
}
]
}
विवादास्पद जसन ऐरे :
string jsonString = "{\r\n \"Items\": [\r\n {\r\n \"playerId\": \"8484239823\",\r\n \"playerLoc\": \"Powai\",\r\n \"playerNick\": \"Random Nick\"\r\n },\r\n {\r\n \"playerId\": \"512343283\",\r\n \"playerLoc\": \"User2\",\r\n \"playerNick\": \"Rand Nick 2\"\r\n }\r\n ]\r\n}";
Player[] player = JsonHelper.FromJson<Player>(jsonString);
Debug.Log(player[0].playerLoc);
Debug.Log(player[1].playerLoc);
आउटपुट :
पवई
User 2
यदि यह सर्वर से Json सरणी है और आपने इसे हाथ से नहीं बनाया है :
आपको {"Items":
प्राप्त स्ट्रिंग के सामने जोड़ना पड़ सकता है, फिर }
इसके अंत में जोड़ें ।
मैंने इसके लिए एक सरल कार्य किया:
string fixJson(string value)
{
value = "{\"Items\":" + value + "}";
return value;
}
तो आप इसका उपयोग कर सकते हैं:
string jsonString = fixJson(yourJsonFromServer);
Player[] player = JsonHelper.FromJson<Player>(jsonString);
3.Deserialize json string बिना क्लास && डी-सीरीज़िंग Json के सांख्यिक गुणों के साथ
यह एक Json है जो एक संख्या या संख्यात्मक गुणों से शुरू होता है।
उदाहरण के लिए:
{
"USD" : {"15m" : 1740.01, "last" : 1740.01, "buy" : 1740.01, "sell" : 1744.74, "symbol" : "$"},
"ISK" : {"15m" : 179479.11, "last" : 179479.11, "buy" : 179479.11, "sell" : 179967, "symbol" : "kr"},
"NZD" : {"15m" : 2522.84, "last" : 2522.84, "buy" : 2522.84, "sell" : 2529.69, "symbol" : "$"}
}
एकता JsonUtility
इसका समर्थन नहीं करती है क्योंकि "15 मी" संपत्ति एक संख्या से शुरू होती है। एक वर्ग चर एक पूर्णांक के साथ शुरू नहीं हो सकता है।
SimpleJSON.cs
एकता की विकि से डाउनलोड करें ।
USD की "15 मी" संपत्ति प्राप्त करने के लिए:
var N = JSON.Parse(yourJsonString);
string price = N["USD"]["15m"].Value;
Debug.Log(price);
ISK की "15 मी" संपत्ति पाने के लिए:
var N = JSON.Parse(yourJsonString);
string price = N["ISK"]["15m"].Value;
Debug.Log(price);
NZD की "15 मी" संपत्ति पाने के लिए:
var N = JSON.Parse(yourJsonString);
string price = N["NZD"]["15m"].Value;
Debug.Log(price);
बाकी जितने गुण जो कि एक संख्यात्मक अंक से शुरू नहीं होते हैं, उन्हें एकता के JsonUtility द्वारा नियंत्रित किया जा सकता है।
4.TROUBLESHOOTING JsonUtility:
समस्याएँ जब के साथ serializing JsonUtility.ToJson
?
खाली स्ट्रिंग या " {}
" के साथ हो रही है JsonUtility.ToJson
?
ए । सुनिश्चित करें कि वर्ग एक सरणी नहीं है। यदि ऐसा है, तो इसके JsonHelper.ToJson
बजाय ऊपर सहायक वर्ग का उपयोग करें JsonUtility.ToJson
।
बी । [Serializable]
उस वर्ग के शीर्ष पर जोड़ें जिसे आप क्रमबद्ध कर रहे हैं।
सी । वर्ग से संपत्ति निकालें। उदाहरण के लिए, चर में, public string playerId { get; set; }
निकालें { get; set; }
। एकता इसे क्रमबद्ध नहीं कर सकती।
समस्याओं के साथ deserializing जब JsonUtility.FromJson
?
ए । यदि आपको मिलता है Null
, तो सुनिश्चित करें कि Json एक Json सरणी नहीं है। यदि ऐसा है, तो इसके JsonHelper.FromJson
बजाय ऊपर सहायक वर्ग का उपयोग करें JsonUtility.FromJson
।
बी । यदि आप NullReferenceException
deserializing करते हैं, [Serializable]
तो कक्षा के शीर्ष पर जोड़ें ।
C। कोई अन्य समस्या, सत्यापित करें कि आपका json मान्य है। यहाँ इस साइट पर जाएँ और json पेस्ट करें। यह आपको दिखाना चाहिए कि क्या json मान्य है। यह भी Json के साथ उचित वर्ग उत्पन्न करना चाहिए। बस को हटाना न भूलें निकालें { get; set; }
प्रत्येक चर से और भी जोड़ [Serializable]
उत्पन्न प्रत्येक वर्ग के शीर्ष करने के लिए।
Newtonsoft.Json:
यदि किसी कारण से Newtonsoft.Json का उपयोग किया जाना चाहिए, तो यहां एकता के लिए forked संस्करण देखें । ध्यान दें कि यदि कुछ सुविधा का उपयोग किया जाता है तो आप दुर्घटना का अनुभव कर सकते हैं। सावधान रहे।
अपने प्रश्न का उत्तर देने के लिए :
आपका मूल डेटा है
[{"playerId":"1","playerLoc":"Powai"},{"playerId":"2","playerLoc":"Andheri"},{"playerId":"3","playerLoc":"Churchgate"}]
जोड़े {"Items":
में सामने की यह तो जोड़ने }
पर अंत इसके बारे में।
यह करने के लिए कोड:
serviceData = "{\"Items\":" + serviceData + "}";
अब आपके पास है:
{"Items":[{"playerId":"1","playerLoc":"Powai"},{"playerId":"2","playerLoc":"Andheri"},{"playerId":"3","playerLoc":"Churchgate"}]}
Php से सरणियों के रूप में कई डेटा क्रमबद्ध करने के लिए , अब आप कर सकते हैं
public player[] playerInstance;
playerInstance = JsonHelper.FromJson<player>(serviceData);
playerInstance[0]
आपका पहला डेटा है
playerInstance[1]
आपका दूसरा डेटा है
playerInstance[2]
आपका तीसरा डेटा है
या के साथ वर्ग के अंदर डेटा playerInstance[0].playerLoc
, playerInstance[1].playerLoc
, playerInstance[2].playerLoc
......
आप playerInstance.Length
इसे एक्सेस करने से पहले लंबाई की जांच करने के लिए उपयोग कर सकते हैं ।
नोट: कक्षा से निकालें । यदि आपके पास है , तो यह काम नहीं करेगा। एकता के वर्ग के सदस्यों के साथ काम नहीं करता है जिन्हें गुणों के रूप में परिभाषित किया गया है ।{ get; set; }
player
{ get; set; }
JsonUtility
[
और]
? वही इसे सूची बनाता है। बस इसे हटाना बंद करें, और इसे एक सरणी या एक सूची के रूप में deserialize करें और मुझे उम्मीद है कि यह ठीक होगा। कृपया उस कोड को पोस्ट करें जिसे आपने आज़माया है।