using Newtonsoft.Json;
using System;
namespace VCommon.Json
{
public class VJsonSerializer : IVJsonSerializer
{
private readonly JsonSerializerSettings _settings; //TODO: 改用 JsonSerializer 实例节省每次创建开销
public VJsonSerializer(JsonSerializerSettings settings) => _settings = settings;
/// 反序列化: 如果传入json为null则返回T的默认值
public T DeserializeObject(string json)
=> json == null
? default(T)
: JsonConvert.DeserializeObject(json, _settings);
/// 反序列化匿名类型: 如果传入json为null则返回T的默认值
public T DeserializeAnonymousTypeObject(string json, T anon = default(T))
=> json == null
? default(T)
: JsonConvert.DeserializeAnonymousType(json, anon, _settings);
/// 反序列化: 按指定类型, 如果传入的json为null则返回该类型的默认值
public object DeserializeObject(string json, Type type)
=> json == null
? (type.IsValueType ? Activator.CreateInstance(type) : null)
: JsonConvert.DeserializeObject(json, type, _settings);
/// 序列化
public string SerializeObject(object obj) => JsonConvert.SerializeObject(obj, _settings);
//static shortcut
private static readonly JsonSerializerSettings IgnoreNullSettings = new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore,
};
private static readonly JsonSerializerSettings IncludeNullSettings = new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Include,
};
public static readonly VJsonSerializer IgnoreNullSerializer = new VJsonSerializer(IgnoreNullSettings);
public static readonly VJsonSerializer IncludeNullSerializer = new VJsonSerializer(IncludeNullSettings);
public static readonly VJsonSerializer DefaultSerializer = IgnoreNullSerializer;
/// 反序列化: 如果传入json为null则返回T的默认值
public static T Deserialize(string json)
=> json == null
? default(T)
: DefaultSerializer.DeserializeObject(json);
/// 反序列化匿名类型: 如果传入json为null则返回T的默认值
public T DeserializeAnonymousType(string json, T anon = default(T))
=> json == null
? default(T)
: DefaultSerializer.DeserializeAnonymousTypeObject(json, anon);
/// 反序列化: 按指定类型, 如果传入的json为null则返回该类型的默认值
public static object Deserialize(string json, Type type)
=> json == null
? (type.IsValueType ? Activator.CreateInstance(type) : null)
: DefaultSerializer.DeserializeObject(json, type);
/// 序列化, 包括值为null的成员
public static string SerializeIncludeNull(object obj) => DefaultSerializer.SerializeObject(obj);
/// 序列化, 忽略值为null的成员, 节省空间
public static string Serialize(object obj) => DefaultSerializer.SerializeObject(obj);
}
}