.NET3.5中JSON用法以及封装JsonUtils工具类 

我们讲到JSON的简单使用,现在我们来研究如何进行封装微软提供的JSON基类,达到更加方便、简单、强大且重用性高的效果。

首先创建一个类JsonUtils.cs,代码如下:

JsonUtils代码,点击展开

using System;
using System.Net;
using System.Reflection;
using System.Collections;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Json;

namespace SLCommon
{
    public class JsonUtils
    {
        /// <summary>
        /// 将JSON文本反序列化成List<T>对象
         /// </summary>
        /// <typeparam name="T">泛型类,实体类型</typeparam>
        /// <param name="jsonString">JSON文本</param>
        /// <returns>返回List<T>对象</returns>
        public static List<T> toList<T>(String jsonString) where T : new()
        {               
            JsonArray jsonArray = JsonArray.Parse(jsonString) as JsonArray;
            
            return toList<T>(jsonArray);
        }

/// <summary>
        /// 将JsonArray对象转化成List<T>对象
         /// </summary>
        /// <typeparam name="T">泛型类,实体类型</typeparam>
        /// <param name="jsonArray">传入的参数JsonArray对象</param>
        /// <returns>返回List<T>对象</returns>
        public static List<T> toList<T>(JsonArray jsonArray) where T : new()
        {      
            //申明泛型List
            List<T> entityList = new List<T>();
            
            //获取泛型类的类型
            Type classType = new T().GetType();
            //获取泛型类中的属性信息
            PropertyInfo[] propertys = 

                   classType.GetProperties(BindingFlags.Public | BindingFlags.Instance);
            
            foreach (JsonObject jsonObject in jsonArray)
            {
                //创建泛型对象
                T entity = new T();
                //遍历属性数组
                foreach (PropertyInfo property in propertys)
                {
                    //得到类中属性的数据类型
                    var type = property.PropertyType.FullName;
                    //通过属性名称prperty.Name在jsonObject中检索到相应的值
                    var val = JsonTypeUtils.TypeConvert(jsonObject[property.Name]);
                    //数据类型转换
                    var value = TypeUtils.ConvertType(type, val);
                    //将属性值赋值给相应的属性
                    property.SetValue(entity, value, null);
                }
                //泛型类对象放入List中
                entityList.Add(entity);
            }
            
            return entityList;
        }
        
        /// <summary>
        /// 将JSON文本反序列化成实体类对象
         /// </summary>
        /// <typeparam name="T">泛型类,实体类型</typeparam>
        /// <param name="jsonString">JSON文本</param>
        /// <returns>返回泛型T类型实体对象</returns>
        public static T toEntity<T>(String jsonString) where T : new()
        {
            JsonObject jsonObject = JsonObject.Parse(jsonString) as JsonObject;

return toEntity<T>(jsonObject);             
        }

/// <summary>
        /// 将JSON对象转化成实体类对象
         /// </summary>
        /// <typeparam name="T">泛型类,实体类型</typeparam>
        /// <param name="jsonObject">JSON对象</param>
        /// <returns>返回泛型T类型实体对象</returns>
        public static T toEntity<T>(JsonObject jsonObject) where T : new()
        {
            //创建泛型对象
            T entity = new T();
            //获取泛型类的类型
            Type classType = entity.GetType();
            //获取泛型类中的属性信息
            PropertyInfo[] propertys = 

                classType.GetProperties(BindingFlags.Public | BindingFlags.Instance);

//遍历属性数组
            foreach (PropertyInfo property in propertys)
            {
                //得到类中属性的数据类型
                var type = property.PropertyType.FullName;
                //通过属性名称prperty.Name在jsonObject中检索到相应的值
                var val = JsonTypeUtils.TypeConvert(jsonObject[property.Name]);
                //数据类型转换
                var value = TypeUtils.ConvertType(type, val);
                //将属性值赋值给相应的属性
                property.SetValue(entity, value, null);
            }

return entity;    
        } 
    }
}

在上面用到了2个辅助类,因为从JsonObject中取到值后,值的数据类型是JsonValue,并非普通的数据类型,在利用反射为类的属性赋值的时候不能识别JsonValue中的数据类型,不能实现数据类型的隐式转换。但它有自己的数据类型如下:

JsonType枚举:

JsonType.Array

JsonType.Boolean

JsonType.Number

JsonType.Object

JsonType.String

我们先通过JsonTypeUtils类来实现JsonType中的数据类型与基本数据类型之间的转换,代码如下:

JsonTypeUtils代码,点击展开

using System;
using System.Net;
using System.Numeric;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Json;

namespace SLCommon
{
    public class JsonTypeUtils
    {
        public static Object TypeConvert(JsonValue jv)
        {
            if(jv.JsonType == JsonType.Array)
            {
                return new JsonArray(jv);
            }
            if (jv.JsonType == JsonType.Boolean)
            {
                return Boolean.Parse(jv.ToString());
            }
            if (jv.JsonType == JsonType.Number)
            {
                return Double.Parse(jv.ToString());
            }
            if (jv.JsonType == JsonType.Object)
            {
                return (Object)jv;
            }
            if (jv.JsonType == JsonType.String)
            {
                return jv.ToString();
            }
                        
            return jv;
        }
    }
}

这时获取到的数据类型只是根据上面5种枚举类型转换的,得到的值并非属性真正的类型,所以需要通过先获取类中属性的数据类型:

var type = property.PropertyType.FullName;

然后通过TypeUtils类的静态方法ConvertType类实现把值转换到属性的类型,代码如下:

TypeUtils代码,点击展开

);
                    val = s;
                    break;
                case "System.Int16":
                case "System.Int32":                
                case "System.Int64":                   
                    val = int.Parse(value.ToString());
                    break;
                case "System.Double":                    
                    val = Double.Parse(value.ToString());
                    break;
                case "System.Decimal":                   
                    val = Decimal.Parse(value.ToString());
                    break;                
                case "System.Object":                    
                    val = (Object)value;
                    break;
            }
          
            return val;
        }
    }
}

在TypeUtils中还只实现了少数数据类型的转换,还有待完善。

下面介绍JsonUtils的用法,先创建实体类FruitEntity.cs,代码如下:

FruitEntity代码,点击展开

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SLEntity
{
    public class FruitEntity
    {        
        private String id;
        private String name;
        private Double price;
        private Double stock;
        private String date;

public String Id
        {
            get { return id; }
            set { id = value; }
        }
        
        public String Name
        {
            get { return name; }
            set { name = value; }
        }

public Double Price
        {
            get { return price; }
            set { price = value; }
        }

public Double Stock
        {
            get { return stock; }
            set { stock = value; }
        }

public String Date
        {
            get { return date; }
            set { date = value; }
        }
    }
}

JsonUtils用法示例代码:

JsonUtils用法代码

\"}";

//上面JSON文本为一个对象,不是多个对象组成的数组。所以转换为实体类:
FruitEntity entity = JsonUtils.toEntity<FruitEntity>(jsonStr);

.NET3.5中JSON用法以及封装JsonUtils工具类的更多相关文章

  1. JAVA中封装JSONUtils工具类及使用

    在JAVA中用json-lib-2.3-jdk15.jar包中提供了JSONObject和JSONArray基类,用于JSON的序列化和反序列化的操作.但是我们更习惯将其进一步封装,达到更好的重用. ...

  2. 在JAVA中封装JSONUtils工具类及使用 (转)

    import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util. ...

  3. 转:轻松把玩HttpClient之封装HttpClient工具类(一)(现有网上分享中的最强大的工具类)

    搜了一下网络上别人封装的HttpClient,大部分特别简单,有一些看起来比较高级,但是用起来都不怎么好用.调用关系不清楚,结构有点混乱.所以也就萌生了自己封装HttpClient工具类的想法.要做就 ...

  4. writeValueAsString封装成工具类

    封装成工具类 <span style="font-family:Microsoft YaHei;">public static String toJsonByObjec ...

  5. 打印 Logger 日志时,需不需要再封装一下工具类?

    在开发过程中,打印日志是必不可少的,因为日志关乎于应用的问题排查.应用监控等.现在打印日志一般都是使用 slf4j,因为使用日志门面,有助于打印方式统一,即使后面更换日志框架,也非常方便.在 < ...

  6. MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  7. MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  8. MySQL JDBC事务处理、封装JDBC工具类

    MySQL数据库学习笔记(十)----JDBC事务处理.封装JDBC工具类 一.JDBC事务处理: 我们已经知道,事务的概念即:所有的操作要么同时成功,要么同时失败.在MySQL中提供了Commit. ...

  9. DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

    DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类) 一.DAO模式简介 DAO即Data Access Object,数据访问接口.数据访问:故名思义就是与数据库打交道.夹在业务逻辑与数据 ...

随机推荐

  1. php大力力 [040节] 买了一天域名,整了一天后台,新网后台不懂啊

    php大力力 [040节] 买了一天域名,整了一天后台,新网后台不懂啊]]] 还有万网那些域名要备案,备案,备案中...................wqnmlgb 今天摩托车的前后轮被扎了,tnn ...

  2. MAC上python+Eclipse+pydev环境搭建

    转自:http://www.cnblogs.com/Bonker/p/3584707.html 本文重点介绍使用Eclipse+pydev插件来写Python代码,  以及在Mac上配置Eclipse ...

  3. Eos持久化实体

    持久化实体 2009-11-30 20:53:38|  分类: 记事本_学习笔记 |  标签: |举报 |字号大中小 订阅     在EOS的实体定义中,如果使用了关联实体方式,主实体的外键属性是不存 ...

  4. D - Half of and a Half 大数

    D - Half of and a Half Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I ...

  5. Java:String和Date、Timestamp之间的转换

    一.String与Date(java.util.Date)互转 1.1 String -> Date String dateStr = "2016-9-28 12:25:55" ...

  6. 【转】AngularJS 取消对 HTML 片段的转义

    今天尝试用 Rails 做后端提供 JSON 格式的数据, AngularJS 做前端处理 JSON 数据,其中碰到 AngularJS 获取的是一段 HTML 文本,如果直接使用 data-ng-b ...

  7. 第一篇T语言实例开发(版本5.3),带错误检测的加减乘除运算器

    带错误检测的加减乘除运算器 表达式 TC综合开发工具里的表达式大体分为:计算表达式.条件表达式 计算表达式: 它一般是用在赋值过程中,或者是和条件表达式混合使用这样的表达式里只有数字运算符(如:+.- ...

  8. C语言实现的Web服务器(转-kungstriving)

    自己研究了好几天终于写出来一个,哈哈,当然也从网上得到了很多的帮助拉.谢谢大家咯!这个版本还不是很完善,但Web服务器的基本框架已经出来了,还有部分的功能需要进行进一步的测试和修改.虽然说C的开发比较 ...

  9. ps颜色模式

    HSB(hue.saturation.bright)  基于人眼 RGB 基于光 CMYK 基于色 LAB 基于大自然颜色库(理论)

  10. JSBinding+SharpKit / 更新的原理

    首先,其实不是热更新,而是更新. 热更新意思是不重启游戏,但只要你脚本里有存储数据,就不可能.所以只能叫更新. 但大家都这么说,所以... 先举个具体的例子: 如果是C#:在 Prefab 的 Gam ...