准备好饮料,我们一起来玩玩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. Javascript 金额、时间格式化

    一晃2017年已经过去了,2018年已经悄然而至.回首过去的2017年,工作还是一如既往,但生活却有了翻天覆地的变化.尚还觉得自己还小的自己,在过去的一年中却完成了两件人生大事,回想起来还是一脸懵逼, ...

  2. C# 动态创建SQL数据库(二)

    使用Entity Framework  创建数据库与表 前面文章有说到使用SQL语句动态创建数据库与数据表,这次直接使用Entriy Framwork 的ORM对象关系映射来创建数据库与表 一 新建项 ...

  3. 探究Entity Framework如何在多个仓储层实例之间工作单元的实现及原理(2018-05-31修改部分严重错误代码)

    前言 1.本文的前提条件:EF上下文是线程唯一,EF版本6.1.3. 2.网上已有相关API的详细介绍,本文更多的是作为我自己的个人学习研究记录. 3.2018-05-31修改DbSession.cs ...

  4. Android开发教程 - 使用Data Binding(六)RecyclerView Adapter中的使用

    本系列目录 使用Data Binding(一)介绍 使用Data Binding(二)集成与配置 使用Data Binding(三)在Activity中的使用 使用Data Binding(四)在Fr ...

  5. C++获取本机IP地址信息

    #include<winsock2.h> #include<iostream> #include<string> using namespace std; #pra ...

  6. 520 简单表白代码(JS)

    这两天不知道咋了,迷迷糊糊的,突然知道今天是520的我,急急忙忙赶出个程序(新手,代码有点乱),发出来大家一起研究下(参考百度的). <!DOCTYPE html> <html> ...

  7. Git-工作区和暂存区的概念

      工作区(Working Directory):就是在电脑里能看到的目录,如testcase文件夹就是一个工作区. 版本库(Repository):工作区有一个隐藏目录.git,是Git的版本库. ...

  8. linux上安装redis4.0.9

    redis安装从3.0的版本到现在4.0的版本,现在装一个4.0的版本供大家学习使用. 先yum安装gcc yum -y install gcc 已加载插件:fastestmirror, langpa ...

  9. markdown的学习记录

    一.markdown用处: 写博客,写微信公众号等等 二.准备工作: 工具使用:由于代码经常使用idea,所以继续使用idea编写markdown,但需要安装插件:MarkDown Navigator ...

  10. JFrame、JPanel 、Layout开发的简单例子

    写了Java这么久,居然发现想手写一个带网格袋布局的JFrame,还不记得怎么写,写了这么多代码真不敢说记得所有细节. 幸好,只要记清楚概念就能快速开发.首先,明确一下3种容器类的差别和用途: No. ...