diff options
author | Zoryn <Zoryn4163@users.noreply.github.com> | 2016-03-27 01:10:18 -0400 |
---|---|---|
committer | Zoryn <Zoryn4163@users.noreply.github.com> | 2016-03-27 01:10:18 -0400 |
commit | 976bc6e2a96aba761c0feff414dd5f95dd4cd991 (patch) | |
tree | 9dd87794562d797ec8291fd00af0409b406467df /StardewModdingAPI/JsonResolver.cs | |
parent | 112305161688eb4d88ccfc79b5636eca6e0ab1d9 (diff) | |
parent | 12bf4fd843be26f89b5fe3415aeec3055c54d786 (diff) | |
download | SMAPI-976bc6e2a96aba761c0feff414dd5f95dd4cd991.tar.gz SMAPI-976bc6e2a96aba761c0feff414dd5f95dd4cd991.tar.bz2 SMAPI-976bc6e2a96aba761c0feff414dd5f95dd4cd991.zip |
Merge pull request #67 from Zoryn4163/master
logging things. not sure if ready for release build, testing for a bit.
Diffstat (limited to 'StardewModdingAPI/JsonResolver.cs')
-rw-r--r-- | StardewModdingAPI/JsonResolver.cs | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/StardewModdingAPI/JsonResolver.cs b/StardewModdingAPI/JsonResolver.cs new file mode 100644 index 00000000..8aac2313 --- /dev/null +++ b/StardewModdingAPI/JsonResolver.cs @@ -0,0 +1,212 @@ +using System; +using System.Collections.Generic; +using Microsoft.Xna.Framework; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Serialization; +using StardewModdingAPI.Inheritance; +using Object = StardewValley.Object; + +namespace StardewModdingAPI +{ + internal class JsonResolver : DefaultContractResolver + { + protected override JsonContract CreateContract(Type objectType) + { + if (objectType == typeof (Rectangle) || objectType == typeof (Rectangle?)) + { + Console.WriteLine("FOUND A RECT"); + JsonContract contract = CreateObjectContract(objectType); + contract.Converter = new RectangleConverter(); + return contract; + } + if (objectType == typeof (Object)) + { + Log.AsyncY("FOUND AN OBJECT"); + JsonContract contract = CreateObjectContract(objectType); + contract.Converter = new ObjectConverter(); + return contract; + } + return base.CreateContract(objectType); + } + } + + public class ObjectConverter : JsonConverter + { + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + Log.AsyncY("TRYING TO WRITE"); + var obj = (Object) value; + Log.AsyncY("TRYING TO WRITE"); + + var jObject = GetObject(obj); + Log.AsyncY("TRYING TO WRITE"); + + try + { + Log.AsyncY(jObject.ToString()); + } + catch (Exception ex) + { + Log.AsyncR(ex); + } + + Console.ReadKey(); + + jObject.WriteTo(writer); + } + + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + var jObject = JObject.Load(reader); + + return GetObject(jObject); + } + + public override bool CanConvert(Type objectType) + { + throw new NotImplementedException(); + } + + protected static JObject GetObject(Object o) + { + try + { + var parentSheetIndex = o.parentSheetIndex; + var stack = o.stack; + var isRecipe = o.isRecipe; + var price = o.price; + var quality = o.quality; + + var oo = new SBareObject(parentSheetIndex, stack, isRecipe, price, quality); + Log.AsyncG(JsonConvert.SerializeObject(oo)); + return JObject.FromObject(oo); + } + catch (Exception ex) + { + Log.AsyncR(ex); + Console.ReadKey(); + } + return null; + } + + protected static Object GetObject(JObject jObject) + { + var parentSheetIndex = GetTokenValue<object>(jObject, "parentSheetIndex") as int?; + var stack = GetTokenValue<object>(jObject, "parentSheetIndex") as int?; + var isRecipe = GetTokenValue<object>(jObject, "parentSheetIndex") as bool?; + var price = GetTokenValue<object>(jObject, "parentSheetIndex") as int?; + var quality = GetTokenValue<object>(jObject, "parentSheetIndex") as int?; + + return new Object(parentSheetIndex ?? 0, stack ?? 0, isRecipe ?? false, price ?? -1, quality ?? 0); + } + + protected static Object GetObject(JToken jToken) + { + var jObject = JObject.FromObject(jToken); + + return GetObject(jObject); + } + + protected static T GetTokenValue<T>(JObject jObject, string tokenName) where T : class + { + JToken jToken; + jObject.TryGetValue(tokenName, StringComparison.InvariantCultureIgnoreCase, out jToken); + return jToken as T; + } + } + + public class RectangleConverter : JsonConverter + { + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + var rectangle = (Rectangle) value; + + var jObject = GetObject(rectangle); + + jObject.WriteTo(writer); + } + + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + Console.WriteLine(reader.ReadAsString()); + var jObject = JObject.Load(reader); + + return GetRectangle(jObject); + } + + public override bool CanConvert(Type objectType) + { + throw new NotImplementedException(); + } + + protected static JObject GetObject(Rectangle rectangle) + { + var x = rectangle.X; + var y = rectangle.Y; + var width = rectangle.Width; + var height = rectangle.Height; + + return JObject.FromObject(new {x, y, width, height}); + } + + protected static Rectangle GetRectangle(JObject jObject) + { + var x = GetTokenValue(jObject, "x") ?? 0; + var y = GetTokenValue(jObject, "y") ?? 0; + var width = GetTokenValue(jObject, "width") ?? 0; + var height = GetTokenValue(jObject, "height") ?? 0; + + return new Rectangle(x, y, width, height); + } + + protected static Rectangle GetRectangle(JToken jToken) + { + var jObject = JObject.FromObject(jToken); + + return GetRectangle(jObject); + } + + protected static int? GetTokenValue(JObject jObject, string tokenName) + { + JToken jToken; + return jObject.TryGetValue(tokenName, StringComparison.InvariantCultureIgnoreCase, out jToken) ? (int) jToken : (int?) null; + } + } + + public class RectangleListConverter : RectangleConverter + { + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + var rectangleList = (IList<Rectangle>) value; + + var jArray = new JArray(); + + foreach (var rectangle in rectangleList) + { + jArray.Add(GetObject(rectangle)); + } + + jArray.WriteTo(writer); + } + + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + var rectangleList = new List<Rectangle>(); + + var jArray = JArray.Load(reader); + + foreach (var jToken in jArray) + { + rectangleList.Add(GetRectangle(jToken)); + } + + return rectangleList; + } + + public override bool CanConvert(Type objectType) + { + throw new NotImplementedException(); + } + } +}
\ No newline at end of file |