using System;
using System.Globalization;
using PlayFab.Internal;
namespace PlayFab.Json
{
public class SimpleJsonInstance : ISerializerPlugin
{
///
/// Most users shouldn't access this
/// JsonWrapper.Serialize, and JsonWrapper.Deserialize will always use it automatically (Unless you deliberately mess with them)
/// Any Serialization of an object in the PlayFab namespace should just use JsonWrapper
///
public static PlayFabSimpleJsonCuztomization ApiSerializerStrategy = new PlayFabSimpleJsonCuztomization();
public class PlayFabSimpleJsonCuztomization : PocoJsonSerializerStrategy
{
///
/// Convert the json value into the destination field/property
///
public override object DeserializeObject(object value, Type type)
{
var valueStr = value as string;
if (valueStr == null) // For all of our custom conversions, value is a string
return base.DeserializeObject(value, type);
var underType = Nullable.GetUnderlyingType(type);
if (underType != null)
return DeserializeObject(value, underType);
else if (type.GetTypeInfo().IsEnum)
return Enum.Parse(type, (string)value, true);
else if (type == typeof(DateTime))
{
DateTime output;
var result = DateTime.TryParseExact(valueStr, PlayFabUtil._defaultDateTimeFormats, CultureInfo.InvariantCulture, PlayFabUtil.DateTimeStyles, out output);
if (result)
return output;
}
else if (type == typeof(DateTimeOffset))
{
DateTimeOffset output;
var result = DateTimeOffset.TryParseExact(valueStr, PlayFabUtil._defaultDateTimeFormats, CultureInfo.InvariantCulture, PlayFabUtil.DateTimeStyles, out output);
if (result)
return output;
}
else if (type == typeof(TimeSpan))
{
double seconds;
if (double.TryParse(valueStr, out seconds))
return TimeSpan.FromSeconds(seconds);
}
return base.DeserializeObject(value, type);
}
///
/// Set output to a string that represents the input object
///
protected override bool TrySerializeKnownTypes(object input, out object output)
{
if (input.GetType().GetTypeInfo().IsEnum)
{
output = input.ToString();
return true;
}
else if (input is DateTime)
{
output = ((DateTime)input).ToString(PlayFabUtil._defaultDateTimeFormats[PlayFabUtil.DEFAULT_UTC_OUTPUT_INDEX], CultureInfo.InvariantCulture);
return true;
}
else if (input is DateTimeOffset)
{
output = ((DateTimeOffset)input).ToString(PlayFabUtil._defaultDateTimeFormats[PlayFabUtil.DEFAULT_UTC_OUTPUT_INDEX], CultureInfo.InvariantCulture);
return true;
}
else if (input is TimeSpan)
{
output = ((TimeSpan)input).TotalSeconds;
return true;
}
return base.TrySerializeKnownTypes(input, out output);
}
}
public T DeserializeObject(string json)
{
return PlayFabSimpleJson.DeserializeObject(json, ApiSerializerStrategy);
}
public T DeserializeObject(string json, object jsonSerializerStrategy)
{
return PlayFabSimpleJson.DeserializeObject(json, (IJsonSerializerStrategy)jsonSerializerStrategy);
}
public object DeserializeObject(string json)
{
return PlayFabSimpleJson.DeserializeObject(json, typeof(object), ApiSerializerStrategy);
}
public string SerializeObject(object json)
{
return PlayFabSimpleJson.SerializeObject(json, ApiSerializerStrategy);
}
public string SerializeObject(object json, object jsonSerializerStrategy)
{
return PlayFabSimpleJson.SerializeObject(json, (IJsonSerializerStrategy)jsonSerializerStrategy);
}
}
}