准备好饮料,我们一起来玩玩JSON,什么是Json:一种数据表示形式,JSON:JavaScript Object Notation对象表示法

Json语法规则:

  • 数据在键值对中
  • 数据由逗号分隔
  • 花括号保存对象
  • 方括号保存数组

一、JSON的表现形式

在javascript中对象的表现形式如下  

  1.对象表现形式:

    <script type="text/javascript">
var jsonObject={code:0,resultmsg:'成功'};
alert(jsonObject.code);
</script>

  2.数组表现形式:

    <script type="text/javascript">
var personInfo=[
{name:'张三',Age:18,sex:'男'},
{name:'小倩',Age:19,sex:'女'},
{name:'小明',Age:18,sex:'男'}
];
alert(personInfo[0].name);
</script>

  3.对象数组联合表现形式:

<script type="text/javascript">
var Studennt=[
{name:'张三',Age:18,sex:'男',succes:[
{name:'语文',succ:89.5},
{name:'数学',succ:89.5},
{name:'外语',succ:89.5}
]
},
{name:'小倩',Age:19,sex:'女',succes:[
{name:'语文',succ:89.5},
{name:'数学',succ:89.5},
{name:'外语',succ:89.5}
]},
{name:'小明',Age:18,sex:'男',succes:[
{name:'语文',succ:89.5},
{name:'数学',succ:89.5},
{name:'外语',succ:89.5}
]}
];
alert(Studennt[0].name);
</script>

二、什么是JSON序列化与反序列化?

序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。
简单来说就是对象转换成为JSON格式字符串我们称为序列化,反之JSON字符串转换为对象我们称为反序列化。
下边我们准备点基础类,部门信息类
using System;

namespace MySerialize.Entity
{
public class DeptInfo
{
public int Id { get; set; }
public string DeptName { get; set; } public DateTime CreateTime { get; set; } }
}
枚举类,分别是职务类别,人员状态。这里简单说下枚举的特点是如果枚举值不指定起始位置默认从0开始,如果指定枚举第一个值则从指定的第一位开始一次递增加一计算枚举值,如果每个枚举值都赋值则按赋值计算,
不理解这句话没关系不影响学习JSON正反序列化。
using System;
namespace MySerialize.Entity
{
/// <summary>
/// 职务类别
/// </summary>
public enum JobType
{
董事长,
总经理,
总监,
部门经理,
人事专员,
职员,
工程师,
其他
} public enum PersonType
{
在职,离职,退休,停职
}
}
用户信息类
using System;
using System.Collections.Generic; namespace MySerialize.Entity
{
public class UserInfo
{
public int Id { get; set; }
public string UserName { get; set; }
/// <summary>
/// 姓
/// </summary>
public string FirstName { get; set; }
/// <summary>
/// 名
/// </summary>
public string LastName { get; set; }
public string PassWord { get; set; } public string Phone { get; set; } public string Address { get; set; } public DeptInfo Dept { get; set; } public JobType DeptType { get; set; } public PersonType UserType { get; set; }
/// <summary>
/// 职业技能
/// </summary>
public Dictionary<int, string> UserSkill { get; set; }
/// <summary>
/// 特长
/// </summary>
public Dictionary<string, string> UserStrong { get; set; }
}
}
数据初始化类
using MySerialize.Entity;
using System;
using System.Collections.Generic; namespace MySerialize
{
public class DataFactory
{
/// <summary>
/// 获取所有专业技能
/// </summary>
/// <returns></returns>
public static Dictionary<int, string> GetSkillAll() {
Dictionary<int, string> DictionarySkill = new Dictionary<int, string>();
DictionarySkill.Add(, "");
DictionarySkill.Add(, "abcd");
DictionarySkill.Add(, "大中国");
DictionarySkill.Add(, "学习");
DictionarySkill.Add(, "上网");
return DictionarySkill;
}
/// <summary>
/// 获取所有的特长
/// </summary>
/// <returns></returns>
public static Dictionary<string, string> GetStrongAll()
{
Dictionary<string, string> DictionaryStrong = new Dictionary<string, string>();
DictionaryStrong.Add("", "abcdefg");
DictionaryStrong.Add("", "abcdefg123");
DictionaryStrong.Add("", "tvbcd");
DictionaryStrong.Add("", "您吃了吗");
DictionaryStrong.Add("", "吃了吗您呢");
DictionaryStrong.Add("", "tvbc 早上好");
DictionaryStrong.Add("", "vbbc 晚上好");
return DictionaryStrong;
}
public static List<UserInfo> BuildUserList()
{
DeptInfo dept0 = new DeptInfo() { CreateTime = DateTime.Now, DeptName = "开发部", Id = };
DeptInfo dept1 = new DeptInfo() { CreateTime = DateTime.Now, DeptName = "电商事业部", Id = };
DeptInfo dept2 = new DeptInfo() { CreateTime = DateTime.Now, DeptName = "成功部", Id = };
DeptInfo dept3 = new DeptInfo() { CreateTime = DateTime.Now, DeptName = "人力资源管理部", Id = };
List<UserInfo> list = new List<UserInfo>();
list.Add(new UserInfo()
{
Address = "北京昌平",
DeptType = JobType.工程师,
Dept = dept0,
Id = ,
FirstName = "张",
LastName = "三",
PassWord = "",
Phone = "",
UserName = "wbc",
UserType = PersonType.在职,
UserSkill = GetSkillAll(),
UserStrong = GetStrongAll()
});
list.Add(new UserInfo()
{
Address = "北京昌平",
DeptType = JobType.工程师,
Dept = dept0,
Id = ,
FirstName = "张",
LastName = "三",
PassWord = "",
Phone = "",
UserName = "wbc",
UserType = PersonType.在职,
UserSkill = GetSkillAll(),
UserStrong = GetStrongAll()
});
list.Add(new UserInfo()
{
Address = "北京昌平",
DeptType = JobType.工程师,
Dept = dept3,
Id = ,
FirstName = "张",
LastName = "三",
PassWord = "",
Phone = "",
UserName = "wbc",
UserType = PersonType.在职,
UserSkill = GetSkillAll(),
UserStrong = GetStrongAll()
});
list.Add(new UserInfo()
{
Address = "北京昌平",
DeptType = JobType.工程师,
Dept = dept2,
Id = ,
FirstName = "wwdd",
LastName = "三",
PassWord = "",
Phone = "",
UserName = "wbc",
UserType = PersonType.在职,
UserSkill = GetSkillAll(),
UserStrong = GetStrongAll()
});
list.Add(new UserInfo()
{
Address = "北京昌平",
DeptType = JobType.工程师,
Dept = dept1,
Id = ,
FirstName = "wang",
LastName = "三",
PassWord = "",
Phone = "",
UserName = "wbc",
UserType = PersonType.在职,
UserSkill = GetSkillAll(),
UserStrong = GetStrongAll()
});
return list; }
}
}

三、常见Json序列化和反序列化类

  1.DataContractJsonSerializer 类序列化和反序列化:

DataContractJsonSerializer 类在 System.Runtime.Serialization.Json这个命名空间下,在net 4.0里面,而这个命名空间在  System.Runtime.Serialization.dll中

 List<UserInfo> list=  DataFactory.BuildUserList();//获取基础数据
//对象的系列化
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(List<UserInfo>));
MemoryStream ms = new MemoryStream();
ser.WriteObject(ms, list);
string jsonString = Encoding.UTF8.GetString(ms.ToArray());
ms.Close();
//反序列化
ser = new DataContractJsonSerializer(typeof(List<UserInfo>));
ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
List<UserInfo> obj = (List<UserInfo>)ser.ReadObject(ms);

  2.JavaScriptSerializer 类序列化和反序列化:

 JavaScriptSerializer 类在 System.Web.Script.Serialization命名空间下了,在net3.0里面,而这个命名空间在  System.Web.Extensions.dll 中

 Dictionary<string, string> dictionaryStrong=  new Dictionary<string, string>();
dictionaryStrong.Add("","");
UserInfo user = new UserInfo() {
Id=,
Dept =new DeptInfo() { CreateTime=DateTime.Now,Id=,DeptName="开发部"},
Address="北京北京市",
DeptType=JobType.工程师,
FirstName="王",
LastName="柏成",
PassWord="",
Phone="",
UserName="wbc",
UserSkill=null,
UserStrong= dictionaryStrong,
UserType=PersonType.在职
};
//序列化
System.Web.Script.Serialization.JavaScriptSerializer jss = new System.Web.Script.Serialization.JavaScriptSerializer();
string jsonString = jss.Serialize(user);
txtData.Text = jsonString;
//反序列化
UserInfo obj = jss.Deserialize<UserInfo>(jsonString);

  3.JsonConvert类序列化和反序列化:

 JsonConvert类在 Newtonsoft.Json 命名空间下了,而这个命名空间在Newtonsoft.Json.dll 中,而这个dll 只是第三方的一个中间件,我们可以通过nuget 获取并引用。

  List<UserInfo> list = DataFactory.BuildUserList();//获取基础数据
//对象的系列化
string jsonString= JsonConvert.SerializeObject(list);
txtData.Text = jsonString;
//反序列化
List<UserInfo> obj = JsonConvert.DeserializeObject<List<UserInfo>>(jsonString);

  4. 简单学习 linq to Json:

 linq to Json 是在Newtonsoft.Json.dll 的 Newtonsoft.Json.linq 命名空间下. json 操作类如下

className(类名) describe(说明)

JObject

用于操作JSON对象

JArray
用语操作JSON数组

JValue

表示数组中的值

JProperty
表示对象中的属性,以"key/value"形式

JToken
用于存放Linq to JSON查询后的结果

创建Json对象和数组组合:

   JArray jArray = new JArray();
JObject staff = new JObject();
staff.Add(new JProperty("Name", "wangbaicheng"));
staff.Add(new JProperty("Age", ));
staff.Add(new JProperty("Department", "销售部"));
staff.Add(new JProperty("Leader", new JObject(new JProperty("Name", "feifei"), new JProperty("Age", ), new JProperty("Department", "chanpin"))));
jArray.Add(staff);
jArray.Add(staff);
jArray.Add(staff);
staff.Add(new JProperty("Array", jArray));
jArray = new JArray();
jArray.Add(new JValue(""));
jArray.Add(new JValue(""));
jArray.Add(new JValue(""));
jArray.Add(new JValue(""));
staff.Add(new JProperty("arr", jArray));
txtData.Text = staff.ToString();

我们还可以通过如字符串获取Json 对象,具体不演示了,看如下表格

方法   说明
JObject.Parse(string json)
json含有JSON对象的字符串,返回为JObject对象,最外层是对象
JObject.FromObject(object o)

o为要转化的对象,返回一个JObject对象

JObject.Load(JsonReader reader)
reader包含着JSON对象的内容,返回一个JObject对象
JArray.Parse(string json)
 json含有JSON数组的字符串,返回为JArray对象,最外层是数组

JArray.FromObject(object o)
 o为要转化的对象,返回一个JArray对象

JArray.Load(JsonReader reader)
 reader包含着JSON对象的内容,返回一个JArray对象

现有如下Json

{\"Name\":\"wangbaicheng\",\"Age\":33,\"Department\":\"销售部\",\"Leader\":{\"Name\":\"feifei\",\"Age\":30,\"Department\":\"chanpin\"},\"Array\":[{\"Name\":\"wangbaicheng\",\"Age\":33,\"Department\":\"销售部\",\"Leader\":{\"Name\":\"feifei\",\"Age\":30,\"Department\":\"chanpin\"}},{\"Name\":\"wangbaicheng\",\"Age\":33,\"Department\":\"销售部\",\"Leader\":{\"Name\":\"feifei\",\"Age\":30,\"Department\":\"chanpin\"}},{\"Name\":\"wangbaicheng\",\"Age\":33,\"Department\":\"销售部\",\"Leader\":{\"Name\":\"feifei\",\"Age\":30,\"Department\":\"chanpin\"}}],\"arr\":[\"1\",\"2\",\"3\",\"4\"]}

我们来看下使用linq 和使用对象来解析Json

 //对象解析json和linq 解析json
{
string json = "{\"Name\":\"wangbaicheng\",\"Age\":33,\"Department\":\"销售部\",\"Leader\":{\"Name\":\"feifei\",\"Age\":30,\"Department\":\"chanpin\"},\"Array\":[{\"Name\":\"wangbaicheng\",\"Age\":33,\"Department\":\"销售部\",\"Leader\":{\"Name\":\"feifei\",\"Age\":30,\"Department\":\"chanpin\"}},{\"Name\":\"wangbaicheng\",\"Age\":33,\"Department\":\"销售部\",\"Leader\":{\"Name\":\"feifei\",\"Age\":30,\"Department\":\"chanpin\"}},{\"Name\":\"wangbaicheng\",\"Age\":33,\"Department\":\"销售部\",\"Leader\":{\"Name\":\"feifei\",\"Age\":30,\"Department\":\"chanpin\"}}],\"arr\":[\"1\",\"2\",\"3\",\"4\"]}";
JObject jObject = JObject.Parse(json); //使用对象解析
string name= jObject["Name"].ToString();//注意大小写
name = jObject.Value<string>("Name");//注意大小写
JArray array= jObject.Value<JArray>("Array");
for (int i = ; i < array.Count; i++)
{
JToken token= array[i];
JObject obj = token as JObject;
Console.WriteLine("对象解析"+obj.Value<string>("Name"));
}
//linq 解析
var names = from staff in jObject["Array"].Children()
select (string)staff["Name"];
foreach (var n in names)
Console.WriteLine("linq解析"+n);
}

这里就不过多的深入了,毕竟我们大多数的时候还是比较喜欢json 转换成为我们自己定义的对象的。

四、封装自己的JsonHelper 类

  public static class JsonHelper
{
#region System.Runtime.Serialization net 4.0
/// <summary>
/// 对象序列化为JSON
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="_t"></param>
/// <returns></returns>
public static string ObjectToJson<T>(this T _t)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream();
ser.WriteObject(ms, _t); string jsonString = Encoding.UTF8.GetString(ms.ToArray());
ms.Close();
return jsonString;
}
/// <summary>
/// 对象反序列化
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="jsonString"></param>
/// <returns></returns>
public static T JsonToObject<T>(this string jsonString)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
T obj = (T)ser.ReadObject(ms);
return obj;
}
#endregion
#region net3.0 System.Web.Extensions.dll
/// <summary>
/// 使用net 3.0 json 反序列化,支持json字符串属性不带引号
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="jsonString"></param>
/// <returns></returns>
public static T JsonToObj<T>(this string jsonString)
{
//引用 System.Web.Extensions.dll
System.Web.Script.Serialization.JavaScriptSerializer jss = new System.Web.Script.Serialization.JavaScriptSerializer();
return jss.Deserialize<T>(jsonString);
}
/// <summary>
/// 使用net 3.5 对象序列化成为json 反序列化,支持json字符串属性不带引号
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="jsonString"></param>
/// <returns></returns>
public static string ObjToJson<T>(this T t)
{
//引用 System.Web.Extensions.dll
System.Web.Script.Serialization.JavaScriptSerializer jss = new System.Web.Script.Serialization.JavaScriptSerializer();
return jss.Serialize(t);
}
#endregion /// <summary>
/// JsonConvert.SerializeObject
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <returns></returns>
public static string ToJson<T>(this T obj)
{
return JsonConvert.SerializeObject(obj);
} /// <summary>
/// JsonConvert.DeserializeObject
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="content"></param>
/// <returns></returns>
public static T ToObject<T>(this string content)
{
return JsonConvert.DeserializeObject<T>(content);
}
}

五、Json 深入

我们都知道,在js中json的key 是可以使用数字的,我们学习了三种序列化方式,如何把一个json 的key 为数字转换成为对象,我们很多开发人员可能都会遇到过。

js 代码如下

<script type="text/javascript">
var obj={1:123,2:456};
alert("obj[1]="+obj[1]);
var objText={"1":123,"2":456};
alert("objText[1]="+objText[1]);
alert("objText[1]="+objText["2"]);
</script>

在微软,很早之前就想到了这一解决方案,但是在4.0升级的时候,升级出来一个bug ,DataContractJsonSerializer 不再支持key 为数字转换,但是其他的两种方式都支持

我们先来看下 JavaScriptSerializer 是如何序列化和反序列化key 为数字的json 。

 1.JavaScriptSerializer 类序列化和反序列化 key 为数字:

 Dictionary<int, string> dictionary1 = DataFactory.GetSkillAll();
Dictionary<string, string> dictionary2 = DataFactory.GetStrongAll();
try
{
string json = dictionary1.ObjToJson();
Dictionary<int, string> d = json.JsonToObj<Dictionary<int, string>>();
}
catch
{ }
try
{
string json = dictionary2.ObjToJson();
Dictionary<string, string> d = json.JsonToObj<Dictionary<string, string>>();
}
catch
{ }

我们上述代码分别为两个字典,字典值均为数字,只是一个是字符串类型的,一个是整数类型的,整数类型的无法序列化和反序列化,字符串类型的可以序列化和反序列化。

看看序列化结果。

{"1":"abcdefg","2":"abcdefg123","3":"tvbcd","4":"您吃了吗","5":"吃了吗您呢","6":"tvbc 早上好","7":"vbbc  晚上好"}

也就是说,微软在早期是只支持字符串类型的数字key

  2.JsonConvert类序列化和反序列化:

这个放心,不论key 是int 类型还是string 类型,都支持的,我们看下案列

Dictionary<int, string> dictionary1 = DataFactory.GetSkillAll();
Dictionary<string, string> dictionary2 = DataFactory.GetStrongAll();
string json1= dictionary1.ToJson();
string json2=dictionary2.ToJson();
Console.WriteLine(json1);
Console.WriteLine(json2);

源码下载地址: 点击下载

在net中json序列化与反序列化的更多相关文章

  1. Net中JSON序列化和反序列化处理(日期时间特殊处理)

    0  缘由 笔者最近在web api端使用Json.Net进行序列化处理,而在调用端使用DataContractSerializer进行反序列化,遇到日期时间处理反序列化不成功[备注:笔者使用Net ...

  2. 在net中json序列化与反序列化 面向对象六大原则 (第一篇) 一步一步带你了解linq to Object 10分钟浅谈泛型协变与逆变

    在net中json序列化与反序列化   准备好饮料,我们一起来玩玩JSON,什么是Json:一种数据表示形式,JSON:JavaScript Object Notation对象表示法 Json语法规则 ...

  3. C#中JSON序列化和反序列化

    有一段时间没有到博客园写技术博客了,不过每天逛逛博客园中大牛的博客还是有的,学无止境…… 最近在写些调用他人接口的程序,用到了大量的JSON.XML序列化和反序列化,今天就来总结下json的序列化和反 ...

  4. .Net中json序列化与反序列化

    NuGet中下载Newtonsoft.Json插件. public class JsonHelper<T>{ public static string ModelToJsonString( ...

  5. day5-python中的序列化与反序列化-json&pickle

    一.概述 玩过稍微大型一点的游戏的朋友都知道,很多游戏的存档功能使得我们可以方便地迅速进入上一次退出的状态(包括装备.等级.经验值等在内的一切运行时数据),那么在程序开发中也存在这样的需求:比较简单的 ...

  6. WPF中的常用布局 栈的实现 一个关于素数的神奇性质 C# defualt关键字默认值用法 接口通俗理解 C# Json序列化和反序列化 ASP.NET CORE系列【五】webapi整理以及RESTful风格化

    WPF中的常用布局   一 写在开头1.1 写在开头微软是一家伟大的公司.评价一门技术的好坏得看具体的需求,没有哪门技术是面面俱到地好,应该抛弃对微软和微软的技术的偏见. 1.2 本文内容本文主要内容 ...

  7. 在SpringMVC中,当Json序列化,反序列化失败的时候,会抛出HttpMessageNotReadableException异常, 当Bean validation失败的时候,会抛出MethodArgumentNotValidException异常,因此,只需要在ExceptionHandler类中添加处理对应异常的方法即可。

    在SpringMVC中,当Json序列化,反序列化失败的时候,会抛出HttpMessageNotReadableException异常, 当Bean validation失败的时候,会抛出Method ...

  8. Scala中使用 Jackson API 进行JSON序列化和反序列化

    1.  什么是 Json 序列化 和 反序列化 序列化 => 将 Java对象 转换成 json字符串反序列化 => 将 json字符串 转换成 Java对象 2. 依赖包 说明 < ...

  9. DotNet的JSON序列化与反序列化

    JSON(JavaScript Object Notation)JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.在现在的通信中,较多的采用JSON数据格式,JSON有 ...

随机推荐

  1. linux 下查看redis内存等占用量

    用客户端连接redis服务器:  ./redis-cli -h ip :port >>info server : 一般 Redis 服务器信息,包含以下域: redis_version : ...

  2. tfs查看最近签入记录及文件

    在团队资源管理=>源代码管理资源管理器=>选择某个最近签入的文件夹=>右键=>查看历史记录=>双击某个文件夹 就能看到最近变更集文件

  3. ASP .Net C# ---Excel导入导出方法

    导入导出的方法以及引用,可以自行创建一个帮助类 using System;using NPOI.SS.UserModel;using NPOI.XSSF.UserModel;using NPOI.HS ...

  4. MS SQL的某一数据库成了Single User模式

    数据库恢复失败,原来的数据却变成了 当尝试打开数据库的属性,即出现上面图片异常的信息. 正常来说,是可以打开数据库的属性 此刻,你可以运行SQL语句来解决: USE master; GO ALTER ...

  5. 《PHP, MySQL, Javascript和CSS》读书随手记----MySQL篇

    一 基础 要求结尾分号 如果在命令输入期间想要终止其运行,不要Ctrl-C. 要输入\c,并按回车键. sql命令和关键字不区分大小写. 表名在windows中不区分大小写,但是在linux和os x ...

  6. Linux 安装JavaEE环境之Tomcat安装笔记

    1.先用xftp将tomcat的压缩包上传到 /opt/ 2.在/usr/local/下使用命令mkdir tomcat 创建tomcat目录 将apache-tomcat-7.0.70.tar.gz ...

  7. 面向对象三大特性编写面向对象程序,self到底是谁

    一.函数式编程和面向对象的对比 面向过程:根据业务逻辑从上到下写垒代码: 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可: 面向对象:对函数进行分类和封装,让开发“更快更好更强. ...

  8. 移动端font-size适配方案(续)

    概述 之前写过一篇移动端font-size适配方案,但是在实践过程中,还是发现当时的思维太局限了,视野太窄了,所以现在补充更新一下,记录下来,供以后开发时参考,相信对其他人也有用. 我上一篇博文主要有 ...

  9. Spring集成Solr搜索引擎

    1.导入jar包<dependency><groupId>org.apache.solr</groupId><artifactId>solr-solrj ...

  10. Ubutntu安装docker启动报Removed /etc/systemd/system/docker.service.

    Ubutntu安装docker启动报Removed /etc/systemd/system/docker.service.的错误,只需要执行以下三条命令. systemctl unmask docke ...