关于json序列化和反序列的问题,没事写个案例,希望能帮到那些需要帮忙的朋友!
现在关于json的读写问题,有许许多多的解决方法,因人而异,根据实际问题去选择自己想要的最容易方法。我觉得自带的Newtonsoft.Json是个不错的选择,随便写两个例子吧!
一:关于简单的json序列化和反序列化,可以用Newtonsoft.Json+实体类去解决。
首先搞个jsonhelp类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Runtime.Serialization.Json;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
namespace SerializationAndDeserialization.Code
{
public class JsonHelp
{
/// <summary>
/// JSON序列化
/// </summary>
public static string JsonSerializer<T>(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();
//替换Json的Date字符串
string p = @"\\/Date\((\d+)\+\d+\)\\/";
MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString);
Regex reg = new Regex(p);
jsonString = reg.Replace(jsonString, matchEvaluator);
return jsonString;
}
/// <summary>
/// JSON反序列化
/// </summary>
public static T JsonDeserialize<T>(string jsonString)
{
//将"yyyy-MM-dd HH:mm:ss"格式的字符串转为"\/Date(1294499956278+0800)\/"格式
string p = @"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}";
MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate);
Regex reg = new Regex(p);
jsonString = reg.Replace(jsonString, matchEvaluator);
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
T obj = (T)ser.ReadObject(ms);
return obj;
}
/// <summary>
/// 将Json序列化的时间由/Date(1294499956278+0800)转为字符串
/// </summary>
private static string ConvertJsonDateToDateString(Match m)
{
string result = string.Empty;
DateTime dt = new DateTime(1970,1,1);
dt = dt.AddMilliseconds(long.Parse(m.Groups[1].Value));
dt = dt.ToLocalTime();
result = dt.ToString("yyyy-MM-dd HH:mm:ss");
return result;
}
/// <summary>
/// 将时间字符串转为Json时间
/// </summary>
private static string ConvertDateStringToJsonDate(Match m)
{
string result = string.Empty;
DateTime dt = DateTime.Parse(m.Groups[0].Value);
dt = dt.ToUniversalTime();
TimeSpan ts = dt - DateTime.Parse("1970-01-01");
result = string.Format("\\/Date({0}+0800)\\/",ts.TotalMilliseconds);
return result;
}
}
}
第二步:建两个要用的实体类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace SerializationAndDeserialization.Code
{
public class Model1
{
public string code { get; set; }
public string description { get; set; }
}
}
public class Model2
{
public string name { get; set; }
public string age { get; set; }
public string sex { get; set; }
public Love love { get; set; }
}
public class Love
{
public string Play { get; set; }
public string Music { get; set; }
}
然后就是搞个测试案例啦:
1:序列化json:
private void test2()
{
List<Model2> list = new List<Model2>();
Love l = new Love();
l.Music = "音乐";
l.Play = "篮球";
Model2 m = new Model2();
m.name = "小明";
m.age = "18";
m.sex = "男";
m.love = l;
list.Add(m);
Love lo = new Love();
lo.Music = "唱歌";
lo.Play = "跳舞";
Model2 m1 = new Model2();
m1.name = "小王";
m1.age = "19";
m1.sex = "男";
m1.love = lo;
list.Add(m1);
string result = JsonHelp.JsonSerializer<List<Model2>>(list);
Response.Write(result);
}
2:先序列化再反序列化效果:
private void test1()
{
Model1 m = new Model1();
m.code = "00000";
m.description = "成功了";
string result = JsonHelp.JsonSerializer<Model1>(m);
Model1 mm = JsonHelp.JsonDeserialize<Model1>(result);
Response.Write(mm.description + "......" + mm.code);
//Response.Write(result);
}
但是。。。。对于一个如果复杂的json来说,你还想按照json视图去写实体类吗?再说建实体类 个人觉得很麻烦,岂不是不同的json格式就要写一个实体类,不是很好的选择。。。
下面就写个利用Newtonsoft.Json和dynamic类型的组合引用解析json:
json格式为:
{
"SvcCont": [
{
"PUB_REQ": {
"TYPE": "ADD_TEST_BEAN"
},
"result": {
"resultCode": "0",
"resultData": {
"accountNumber": "05519430313",
"areaID": "0001",
"servicetype": 201,
"vbRestValue": 0,
"vbTotalValue": 0
},
"resultMsg": "成功"
}
}
],
"TcpCont": {
"LatnCd": "551",
"ServiceCode": "FUNC99002",
"SrcOrgID": "30",
"SrcSysID": "1030",
"SrcSysSign": "5273C8FD1C9B483A1A8BC49BAF363987",
"TransactionID": "20140709101229"
}
}
下面我就说如何得到:resultCode 和resultMsg的值 !
//模拟json字符串
string ss = "{\"SvcCont\":[{\"PUB_REQ\":{\"TYPE\":\"ADD_TEST_BEAN\"},\"result\":{\"resultCode\":\"0\",\"resultData\":{\"accountNumber\":\"05519430313\",\"areaID\":\"0001\",\"servicetype\":201,\"vbRestValue\":0,\"vbTotalValue\":0},\"resultMsg\":\"成功\"}}],\"TcpCont\":{\"LatnCd\":\"551\",\"ServiceCode\":\"FUNC99002\",\"SrcOrgID\":\"30\",\"SrcSysID\":\"1030\",\"SrcSysSign\":\"5273C8FD1C9B483A1A8BC49BAF363987\",\"TransactionID\":\"20140709101229\"}}";
//一步一步去解析,根据自己的要求和json格式一层一层反序列化
if (ss.StartsWith("{") && ss.EndsWith("}")
|| ss.StartsWith("[") && ss.EndsWith("]"))
{
dynamic xx = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(ss);
dynamic resultData = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(xx.SvcCont.ToString());
List<dynamic> pags = Newtonsoft.Json.JsonConvert.DeserializeObject<List<dynamic>>(resultData.ToString());
foreach (var pag in pags)
{
dynamic pagss = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(pag.result.ToString());
string code = pagss.resultCode.ToString();
string msg = pagss.resultMsg.ToString();
Response.Write("code值为Code:" + code + ",mess的值为:" + msg);
}
}
好了,以上就是简单json序列化和反序列化的问题,希望对你有帮助!
关于json序列化和反序列的问题,没事写个案例,希望能帮到那些需要帮忙的朋友!的更多相关文章
- Newtonsoft.Json序列化和反序列之javascriptConvert.SerializeObject,DeserializeObject,JsonWriter,JsonReader
这里下载:http://www.newtonsoft.com/products/json/安装: 1.解压下载文件,得到Newtonsoft.Json.dll 2.在项目中添加引用.. jav ...
- (转)Newtonsoft.Json序列化和反序列
这里下载:http://www.newtonsoft.com/products/json/安装: 1.解压下载文件,得到Newtonsoft.Json.dll 2.在项目中添加引用.. 序列化 ...
- Newtonsoft.Json序列化和反序列
这里下载:http://www.newtonsoft.com/products/json/安装: 1.解压下载文件,得到Newtonsoft.Json.dll 2.在项目中添加引用.. 序列化 ...
- c# Newtonsoft.Json序列化和反序列 js解析
Newtonsoft.Json下载地址:http://www.newtonsoft.com/products/json/ 参考: http://www.cnblogs.com/yanweid ...
- C# Json数组序列化和反序列总结
1.创建json数组,例: JArray arrFile = new JArray(); arrFile.Add(new JObject() { new JProperty("FilePat ...
- WPF中的常用布局 栈的实现 一个关于素数的神奇性质 C# defualt关键字默认值用法 接口通俗理解 C# Json序列化和反序列化 ASP.NET CORE系列【五】webapi整理以及RESTful风格化
WPF中的常用布局 一 写在开头1.1 写在开头微软是一家伟大的公司.评价一门技术的好坏得看具体的需求,没有哪门技术是面面俱到地好,应该抛弃对微软和微软的技术的偏见. 1.2 本文内容本文主要内容 ...
- [.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) Json 序列化利器 Newtonsoft.Json 及 通用Json类
[.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) Json 序列化利器 Newtonsoft.Json 及 通用Json类 本节导读: 关于JSON序列化,不能 ...
- DotNet的JSON序列化与反序列化
JSON(JavaScript Object Notation)JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.在现在的通信中,较多的采用JSON数据格式,JSON有 ...
- WCF传输1-你是否使用过压缩或Json序列化?
1.当遇到需要传输大量数据时,怎么样传输数据? 2.压缩数据有哪几种常见的方式? 问题1解答:通过压缩来传输数据 问题2解答: (1)WCF自带的压缩方式 (2)自定义WCF binding进行压缩 ...
随机推荐
- Eclipse JAVA项目的 目录结构 和 导入
说明:本文所有测试以java工程为例: 1. Eclipse下的java工程目录 eclipse的基本工程目录叫做workspace,每个运行时的eclipse实例只能对应一个workspace,也就 ...
- mysql入门安装遇到问题_2016-10-28
1. brew安装完mysql之后直接输入mysql -u root -p 显示 can't connect to mysql server through socket, 后来问题应该是server ...
- [原] XAF 如何启用ListView Top N records 提升用户使用体验
為了提升用戶使用體驗,特擴展此功能(來源與Xafari Framework).1.可在模型編輯器中設置是否啓用,默認啓用.2.DataAccessMode為Client模式才啓用.其它模式自動關閉.3 ...
- java基础4_字符串
一 字符串 Java字符串关键字是String,是一个类,创建新的字符串即创建一个新的对象. 1.字符串的声明及初始化. String str; //只做声明 String str1="aa ...
- C语言采用文本方式和二进制方式打开文件的区别分析
稍微了解C程序设计的人都知道,文本文件和二进制文件在计算机上面都是以0,1存储的,那么两者怎么还存在差别呢?对于编程人员来说,文本文件和二进制文件就是一个声明,指明了你应该以什么方式(文本方式/二进制 ...
- java-android推送
之前做的推送,考虑了很多,最后因为各个因素,选择了极光的.
- java入门(1)
今天开始了java的学习,是同学给的一个说是外面培训的视频,因为我个人的专业是硬件,对软件开发其实也蛮有兴趣,不过确实有跟风的嫌疑哈,因为大家都说现在的主流就是java,所以就跟软件的人要了它的资料, ...
- oracle数据库导入导出
简单记录下数据泵导出导入expdp .impdp 和 普通导出导入 exp.imp 一.数据泵导出数据库(按用户)步骤: 1.以oracle用户登录oracle所在服务器,创建数据库备份文件目录 &g ...
- 《理解 ES6》阅读整理:函数(Functions)(三)Function Constructor & Spread Operator
增强的Function构造函数(Increased Capabilities of the Function Constructor) 在Javascript中Function构造函数可以让你创建一个 ...
- 打开mysql时,提示 1040,Too many connections
打开mysql时,提示 1040,Too many connections,这样就无法打开数据库,看不了表里边的内容了. 出现这个问题的原因是,同时对数据库的连接数过大,mysql默认的最大连接数是1 ...