.NET3.5中JSON用法以及封装JsonUtils工具类
.NET3.5中JSON用法以及封装JsonUtils工具类
我们讲到JSON的简单使用,现在我们来研究如何进行封装微软提供的JSON基类,达到更加方便、简单、强大且重用性高的效果。
首先创建一个类JsonUtils.cs,代码如下:
JsonUtils代码,点击展开
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 =
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 =
//遍历属性数组
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.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.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工具类的更多相关文章
- JAVA中封装JSONUtils工具类及使用
在JAVA中用json-lib-2.3-jdk15.jar包中提供了JSONObject和JSONArray基类,用于JSON的序列化和反序列化的操作.但是我们更习惯将其进一步封装,达到更好的重用. ...
- 在JAVA中封装JSONUtils工具类及使用 (转)
import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util. ...
- 转:轻松把玩HttpClient之封装HttpClient工具类(一)(现有网上分享中的最强大的工具类)
搜了一下网络上别人封装的HttpClient,大部分特别简单,有一些看起来比较高级,但是用起来都不怎么好用.调用关系不清楚,结构有点混乱.所以也就萌生了自己封装HttpClient工具类的想法.要做就 ...
- writeValueAsString封装成工具类
封装成工具类 <span style="font-family:Microsoft YaHei;">public static String toJsonByObjec ...
- 打印 Logger 日志时,需不需要再封装一下工具类?
在开发过程中,打印日志是必不可少的,因为日志关乎于应用的问题排查.应用监控等.现在打印日志一般都是使用 slf4j,因为使用日志门面,有助于打印方式统一,即使后面更换日志框架,也非常方便.在 < ...
- MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- MySQL JDBC事务处理、封装JDBC工具类
MySQL数据库学习笔记(十)----JDBC事务处理.封装JDBC工具类 一.JDBC事务处理: 我们已经知道,事务的概念即:所有的操作要么同时成功,要么同时失败.在MySQL中提供了Commit. ...
- DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)
DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类) 一.DAO模式简介 DAO即Data Access Object,数据访问接口.数据访问:故名思义就是与数据库打交道.夹在业务逻辑与数据 ...
随机推荐
- HDU 4734 F(x)
这题可能非递归版好写? #include<iostream> #include<cstdio> #include<cstring> #include<algo ...
- C#异步批量下载文件
C#异步批量下载文件 实现原理:采用WebClient进行批量下载任务,简单的模拟迅雷下载效果! 废话不多说,先看掩饰效果: 具体实现步骤如下: 1.新建项目:WinBatchDownload 2.先 ...
- 使用POSIX正则库匹配一行中多个结果
正则匹配与正则表达式是什么东西我就不说了,在这里说下POSIX这个c语言正则库在对字符串进行正则匹配时取出多个结果的问题. 首先简单说明下POSIX正则库的几个函数和使用方法 第一个函数:int re ...
- linux 远程管理
启动linuxssh 服务: /etc/init.d/ssh 启动网络服务: service network restart linux远程登录配置过程: 首先在ubuntu下安装openssh-se ...
- 极简版 react+webpack 脚手架
目录结构 asset/ css/ img/ src/ entry.js ------------------------ 入口文件 .babelrc index.html package.json w ...
- redis-persist上线
九月份惨不忍睹,因为代码质量不够高,直接被Boss喷成了筛子.被反复教育说要高质量的代码,要可维护.高性能…… 幸而,最后一周终于在紧张的加班中,灰度上线redis-land-go了,项目也改名为re ...
- springMVC 拦截器简单配置
在spring 3.0甚础上,起来越多的用到了注解,从前的拦截器在配置文件中需要这样配置 <beans...> ... <bean id="measurementInter ...
- win7 下 arp 绑定mac和Ip
我们都知道直接执行arp -s 命令即可绑定IP和MAC地址,但是在Win7下会遇到不能运行arp -s 进行静态mac绑定的情况,提示“ARP 项添加失败: 拒绝访问.”(英文版提示:The ARP ...
- python requests库入门[转]
首先,确认一下: Requests 已安装 Requests是 最新的 让我们从一些简单的示例开始吧. 发送请求 使用Requests发送网络请求非常简单. 一开始要导入Requests模块: > ...
- [转]Could not load file or assembly 'System.Core, Version=2.0.5.0 和autofac冲突的问题
Could not load file or assembly 'System.Core, Version=2.0.5.0 和autofac冲突的问题 来源:http://www.cnblogs.co ...