2025-07-14 21:54:09 +08:00

164 lines
7.1 KiB
C#

// Example - Parse and handle JSON
using UnityEngine;
using Leguar.TotalJSON;
namespace Leguar.TotalJSON.Examples {
public class ParseAndHandleJSON : MonoBehaviour {
void Start() {
// Parsing Facebook user data
Debug.Log("---> Running ParseAndHandleJSON.ReadFBUserData()");
string dataFromFB = ReadFBUserData();
Debug.Log("---> Running ParseAndHandleJSON.ParseFBUserData()");
ParseFBUserData(dataFromFB);
// Parsing Google Play Store receipt data
Debug.Log("---> Running ParseAndHandleJSON.ReadGPSReceiptData()");
string dataFromGPS = ReadGPSReceiptData();
Debug.Log("---> Running ParseAndHandleJSON.ParseGPSReceiptData()");
ParseGPSReceiptData(dataFromGPS);
}
// Returns example JSON string that is in same format than real data received from Facebook would be when receiving player account info
private string ReadFBUserData() {
string dataFromFB = @"
{
""id"":""123456789012345"",
""name"":""Mumble Happyfeet"",
""first_name"":""Mumble"",
""last_name"":""Happyfeet"",
""picture"":{
""data"":{
""height"":50,
""width"":50,
""is_silhouette"":false,
""url"":""https://platform-lookaside.fbsbx.com/platform/profilepic/?asid=123456789012345&height=50&width=50&ext=1234567890&hash=AbCdeFghijkLmnop""
}
},
""email"":""not.exist@leguar.com"",
""gender"":""male"",
""birthday"":""02/02/1979"",
""location"":{
""location"":{
""city"":""Helsinki"",
""country"":""Finland"",
""latitude"":60.1708,
""longitude"":24.9375
},
""id"":""109876543210987""
},
""currency"":{
""currency_offset"":100,
""usd_exchange"":1.1534292,
""usd_exchange_inverse"":0.8669799585,
""user_currency"":""EUR""
}
}";
return dataFromFB;
}
private void ParseFBUserData(string jsonDataFromFbAsString) {
// Parse string data received from FB to JSON
// Second (optional) parameter is ID for debug purposes. If anything fails in JSON parsing, this debug id is added to exception message.
// This will greatly help tracking problems in projects where lots of JSON objects are handled and stack trace is not necessary available (like in production builds).
// This same debug id will be attached also to resulting JSON object so that if any exceptions happens afterwards (for example when reading values from JSON),
// thos eexceptions will have this ID printed out also.
JSON fbUserJSON = JSON.ParseString(jsonDataFromFbAsString,"FBUserJSON");
// Set JSON protected (read only) so no accidental changes are made to it
// In this example this is of course somewhat pointless since JSON is only used locally in this method and not passed forward to anywhere
// But very handy if this JSON is paased forward and you want to make sure no other code accidentally changes anything
fbUserJSON.SetProtected();
// Add this JSON object to runtime debug in Unity Editor
// After this call, you can see content of this JSON object in Unity Editor, by choosing "Window -> Total JSON -> JSON Runtime Debug" from Unity menu
fbUserJSON.DebugInEditor("FB User JSON");
// Get user basic info
string userId = fbUserJSON.GetString("id");
string userName = fbUserJSON.GetString("name");
// Get user picture info
JSON userPictureData = fbUserJSON.GetJSON("picture").GetJSON("data");
bool isPictureSilhouette = userPictureData.GetBool("is_silhouette");
string pictureUrl = userPictureData.GetString("url");
// Get country
string country;
try {
// This code just assumes data contains location information, which it in real life doesn't necessary do
country = fbUserJSON.GetJSON("location").GetJSON("location").GetString("country");
}
catch (JSONKeyNotFoundException) { // The lazy way to handle possibly missing information
country = "Unknown";
}
// Get currency USD exchange
decimal? usdExchange = null;
if (fbUserJSON.ContainsKey("currency")) {
JSON userCurrency = fbUserJSON.GetJSON("currency");
usdExchange = userCurrency.GetJNumber("usd_exchange").AsDecimal();
}
// Print out what we got
Debug.Log("userId = " + userId);
Debug.Log("userName = " + userName);
Debug.Log("isPictureSilhouette = " + isPictureSilhouette);
Debug.Log("pictureUrl = " + pictureUrl);
Debug.Log("country = " + country);
Debug.Log("usdExchange = " + usdExchange);
}
// Returns example JSON string that is in same format than real data received from Google Play store would be when receiving purchase receipt
private string ReadGPSReceiptData() {
// Note that receipt really contains JSON that added inside other JSON's as strings, causing lots of escaping.
// Then the string is escaped once more here (using TotalJSON Validator included to this package) to make it compatible for adding it to c# source code.
string dataFromGPS = "{\"Store\":\"GooglePlay\",\"TransactionID\":\"XYZ.1337-4242-1234-12345\",\"Payload\":\"{\\\"json\\\":\\\"{\\\\\\\"orderId\\\\\\\":\\\\\\\"XYZ.1337-4242-1234-12345\\\\\\\",\\\\\\\"packageName\\\\\\\":\\\\\\\"com.example.test\\\\\\\",\\\\\\\"productId\\\\\\\":\\\\\\\"niceProduct\\\\\\\",\\\\\\\"purchaseTime\\\\\\\":1504030209999,\\\\\\\"purchaseState\\\\\\\":0,\\\\\\\"purchaseToken\\\\\\\":\\\\\\\"abcdefghijklmno.AA-B1Cd--AbcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNO\\\\\\\"}\\\",\\\"signature\\\":\\\"abcdefghijklmnopqrstuvwxyz\\\\/0123456789abcdefghijklmnopqrstuvwxyz+ETCetc==\\\"}\"}";
return dataFromGPS;
// Actual data without this last round of escaping looks like this:
// {"Store":"GooglePlay","TransactionID":"XYZ.1337-4242-1234-12345","Payload":"{\"json\":\"{\\\"orderId\\\":\\\"XYZ.1337-4242-1234-12345\\\",\\\"packageName\\\":\\\"com.example.test\\\",\\\"productId\\\":\\\"niceProduct\\\",\\\"purchaseTime\\\":1504030209999,\\\"purchaseState\\\":0,\\\"purchaseToken\\\":\\\"abcdefghijklmno.AA-B1Cd--AbcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNO\\\"}\",\"signature\":\"abcdefghijklmnopqrstuvwxyz\\/0123456789abcdefghijklmnopqrstuvwxyz+ETCetc==\"}"}
}
private void ParseGPSReceiptData(string jsonDataFromGpsAsString) {
// Parse string to JSON object
JSON jsonReceipt = JSON.ParseString(jsonDataFromGpsAsString);
Debug.Log("Store: " + jsonReceipt.GetString("Store"));
Debug.Log("TransactionID: " + jsonReceipt.GetString("TransactionID"));
// Parse payload to JSON object as it is saved as string to previous JSON object
JSON payloadAsJSON = JSON.ParseString(jsonReceipt.GetString("Payload"));
string signature = payloadAsJSON.GetString("signature");
Debug.Log("Signature: " + signature);
// One more round of parsing, as receipt is saved as string in previous JSON object
string receiptAsString = payloadAsJSON.GetString("json");
// In some cases there's no need to parse this string to JSON as some purchase validating backend exactly needs this receipt-json as string
// Just for sake of additional parsing example
JSON receiptAsJSON = JSON.ParseString(receiptAsString);
Debug.Log("packageName: " + receiptAsJSON.GetString("packageName"));
Debug.Log("purchaseTime: " + receiptAsJSON.GetJNumber("purchaseTime").AsLong());
}
}
}