164 lines
7.1 KiB
C#
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());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|