Skip to content

Instantly share code, notes, and snippets.

@irfanbaysal
Created January 15, 2024 18:28
Show Gist options
  • Save irfanbaysal/1cb3d356d1f8315d85c31fa215c58c61 to your computer and use it in GitHub Desktop.
Save irfanbaysal/1cb3d356d1f8315d85c31fa215c58c61 to your computer and use it in GitHub Desktop.
Json Examples Part 3
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using UnityEngine;
namespace JsonDeserializeExample.Scripts
{
public enum VehicleType
{
Default,
Hybrid,
Electric
}
public class JsonExample : MonoBehaviour
{
[SerializeField] private List<VehicleData> vehicles = new();
[SerializeField] private string serializedVehicle;
[SerializeField]private List<VehicleData> deserializedVehicles = new();
[SerializeField] private bool serialize;
[SerializeField] private bool deserialize;
private void Start()
{
Debug.Log($"Unformatted :{serializedVehicle}");
BeautifyJson();
Debug.Log($"Formatted : {serializedVehicle}");
}
private void Serialize()
{
//serializedVehicle = JsonConvert.SerializeObject(vehicles);
serializedVehicle = JsonConvert.SerializeObject(vehicles);
}
private void Deserialize()
{
deserializedVehicles = JsonConvert.DeserializeObject<List<VehicleData>>(serializedVehicle);
}
public void BeautifyJson()
{
JsonSerializerSettings settings = new JsonSerializerSettings()
{
Formatting = Formatting.Indented
};
settings.Formatting = Formatting.Indented;
JToken jToken = JsonConvert.DeserializeObject<JToken>(serializedVehicle, settings);
serializedVehicle = JsonConvert.SerializeObject(jToken, settings);
}
#if UNITY_EDITOR
private void OnValidate()
{
if (serialize)
{
Serialize();
}
else
{
serializedVehicle = "";
}
if (deserialize)
{
Deserialize();
}
else
{
deserializedVehicles.Clear();
}
}
#endif
}
[Serializable]
public struct VehicleData // IPropertyData
{
[JsonConverter(typeof(VehicleJsonConverter))]
[SerializeReference] public IVehicle Vehicle;
// IFurniture
// IElectronics...
}
public interface IVehicle
{
public string ID { get; set; }
public int Year { get; set; }
}
[Serializable]
public abstract class Vehicle : IVehicle
{
public VehicleType vehicleType;
public double price;
public string ID { get; set; }
public int Year { get; set; }
}
[Serializable]
public class Car : Vehicle
{
public Car()
{
ID = "Car";
Year = 2023;
}
}
[Serializable]
public class Motor : Vehicle
{
public Motor()
{
ID = "Motor";
Year = 2024;
}
}
public class VehicleJsonConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, value);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var jsonObject = JObject.Load(reader);
var motor = jsonObject.ToObject<Motor>().ID == "Motor";
var car = jsonObject.ToObject<Car>().ID == "Car";
if (motor)
{
return jsonObject.ToObject<Motor>(serializer);
}
if (car)
{
return jsonObject.ToObject<Car>(serializer);
}
return null;
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof(IVehicle);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment