C# 的JSON工具类

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));
        }
    }
}

 

转载于:https://my.oschina.net/u/3237893/blog/829505

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值