Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
124 changes: 124 additions & 0 deletions Runtime/GameplayTagJsonConverter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace BandoWare.GameplayTags
{
public class GameplayTagJsonConverter : JsonConverter<GameplayTag>
{
public override void WriteJson(JsonWriter writer, GameplayTag value, JsonSerializer serializer)
{
JObject obj = new JObject
{
{ "tagName", value.IsNone ? "" : value.Name }
};
obj.WriteTo(writer);
}

public override GameplayTag ReadJson(JsonReader reader, Type objectType, GameplayTag existingValue, bool hasExistingValue, JsonSerializer serializer)
{
JObject jObject = JObject.Load(reader);
string tagName = jObject["tagName"]?.Value<string>();

if (string.IsNullOrEmpty(tagName))
return GameplayTag.None;

return GameplayTagManager.RequestTag(tagName);
}
}

public class GameplayTagContainerJsonConverter : JsonConverter<GameplayTagContainer>
{
public override void WriteJson(JsonWriter writer, GameplayTagContainer value, JsonSerializer serializer)
{
if (value == null)
{
writer.WriteNull();
return;
}

JArray tagsArray = new JArray();

foreach (GameplayTag tag in value.GetExplicitTags())
{
JObject tagObj = new JObject
{
{ "tagName", tag.ToString() }
};
tagsArray.Add(tagObj);
}

JObject containerObj = new JObject
{
{ "gameplayTags", tagsArray }
};

containerObj.WriteTo(writer);
}

public override GameplayTagContainer ReadJson(JsonReader reader, Type objectType, GameplayTagContainer existingValue, bool hasExistingValue, JsonSerializer serializer)
{
JObject jObject = JObject.Load(reader);
JArray tagsArray = jObject["gameplayTags"] as JArray;

GameplayTagContainer container = new GameplayTagContainer();

if (tagsArray == null)
return container;

foreach (JObject tagObj in tagsArray)
{
string tagName = tagObj["tagName"]?.Value<string>();

if (string.IsNullOrEmpty(tagName))
continue;

GameplayTag tag = GameplayTagManager.RequestTag(tagName);
if (tag.IsValid)
container.AddTag(tag);
}

return container;
}
}

public static class GameplayTagJsonSettings
{
private static JsonSerializerSettings s_Settings;

public static JsonSerializerSettings Settings
{
get
{
if (s_Settings == null)
{
s_Settings = new JsonSerializerSettings
{
Converters = new JsonConverter[]
{
new GameplayTagJsonConverter(),
new GameplayTagContainerJsonConverter()
}
};
}
return s_Settings;
}
}

/// <summary>
/// Serializes an object to JSON using GameplayTag converters.
/// </summary>
public static string Serialize(object obj)
{
return JsonConvert.SerializeObject(obj, Settings);
}

/// <summary>
/// Deserializes JSON to an object using GameplayTag converters.
/// </summary>
public static T Deserialize<T>(string json)
{
return JsonConvert.DeserializeObject<T>(json, Settings);
}
}
}
2 changes: 2 additions & 0 deletions Runtime/GameplayTagJsonConverter.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.