using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System.IO;
using System.IO.Compression;
namespace Framework.Common
{
public class JsonUtil
{
/// <summary>
/// 获取JsonSerializer序列化对象。
/// </summary>
/// <returns>返回JsonSerializer对象</returns>
private static JsonSerializer GetJsonSerializer()
{
JsonSerializer serializer = new JsonSerializer();
IsoDateTimeConverter dc = new IsoDateTimeConverter();
dc.DateTimeFormat = "yyyy-MM-dd HH:mm:ss";
serializer.Converters.Add(dc);
IsoDateTimeConverter dcs = new IsoDateTimeConverter();
dcs.DateTimeFormat = "yyyy-MM-dd";
serializer.Converters.Add(dcs);
EnumTypeJsonConverter ec = new EnumTypeJsonConverter();
serializer.Converters.Add(ec);
DecimalTypeJsonConverter dec = new DecimalTypeJsonConverter();
serializer.Converters.Add(dec);
return serializer;
}
public static string toJson(Object obj)
{
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
GetJsonSerializer().Serialize(sw, obj);
sw.Flush();
sw.Close();
sw.Dispose();
sw = null;
return sb.ToString();
}
public static object toObject(String json, Type type)
{
object retObj = null;
TextReader txtReader = null;
try
{
txtReader = new StringReader(json);
retObj = GetJsonSerializer().Deserialize(txtReader, type);
}
finally
{
if (txtReader != null)
{
txtReader.Close();
txtReader.Dispose();
txtReader = null;
}
}
return retObj;
}
public static T toObject<T>(String json)
{
TextReader tr = new StringReader(json);
return (T)GetJsonSerializer().Deserialize(tr, typeof(T));
}
}
/// <summary>
/// 转枚举时默认取的是实际的值,这里改为取显示的值
/// </summary>
class EnumTypeJsonConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType.IsEnum;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return Enum.Parse(objectType, reader.Value.ToString());
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteValue((value).ToString());
}
}
/// <summary>
/// 添加对Decimal的支持
/// </summary>
class DecimalTypeJsonConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType.Name.Equals("Decimal");
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
这里有个问题,从JsonReader.Value中取出来的数据为4位小数,序列化到POJO中只有2位
string v = Convert.ToString(reader.Value == null ? "" : reader.Value);
return Convert.ToDecimal(v.Trim().Length == 0 ? 0 : reader.Value);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
string v = Convert.ToString(value == null ? "" : value);
writer.WriteValue(Convert.ToDecimal(v.Trim().Length == 0 ? "0" : v));
}
}
}