关于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进行压缩 ...
随机推荐
- [spark案例学习] 单词计数
数据准备 数据下载:<莎士比亚全集> 我们先来看看原始数据:首先将数据加载到RDD,然后显示数据框的前15行. shakespeareDF = sqlContext.read.text(f ...
- #笔记# 移动前端开发之viewport
一般移动设备的浏览器都默认设置了一个 viewport ,并初始定义一个虚拟的layout viewport(布局视口),用于解决早期的页面在手机上显示的问题.下面我们来认识几个与 viewport ...
- Cassandra对读写请求的处理机制
1 写请求: 单数据中心: 向所有副本发写请求, 所有副本都写数据, 只要有一致性水平指定数目的节点返回正确响应, 就认为写成功. 多数据中心: 客户端发起写数据请求后, 本地代理节点会把请求发给每个 ...
- TCL:读取表格(xls)中的数据
intToChar.tcl # input a number : 1 to 32 , you will get a char A to Z #A-Z:1-32 proc intToChar {int} ...
- [转]Java学习日记之 volatile
用在多线程,同步变量. 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B.只在某些动作时才进行A和B的同步.因此存在A和B不一致的情况.volatile就是用来 ...
- Android 抗锯齿的两种方法
Android 抗锯齿的两种方法 (其一:paint.setAntiAlias(ture);paint.setBitmapFilter(true)) 在Android中,目前,我知道有两种出现锯齿 ...
- JavaWeb开发学习(二)-配置Tomcat服务器
1. 下载Tomcat服务器 Tomcat是一个免费.开源的JavaWeb服务器. Tomcat官网是http://tomcat.apache.org/ 我使用的是版本是Tomcat7.0,下载Zip ...
- BI先特技软件 Analyzer安装时的部分问题
废话不多,先看第一个问题,我先运行了 Analyzer.3.0.2357b.64.exe 然后就是傻瓜式地下一步 好的,现在问题来了,当我运行安装完毕的Analyzer时,页面给了我这样的提示“ HT ...
- [Xamarin] 從Xamarin中呼叫 *.jar 的 library -建立.jar篇 (转帖)
嗯,這篇我們來聊聊如何從Xamarin 中來呼叫,已經包好的.jar ,首先因為要讓測試順利,我們開一個Android Java 的專案 當然是Eclipse ,然後我們簡簡單單寫一個測試用的libr ...
- 深入理解Ember-Data特性(上)
写在前面 最近比较忙,换了新工作还要学习很多全新的技术栈,并给自己找了很多借口来不去坚持写博客.常常具有讽刺意味的是,更多剩下的时间并没有利用而更多的是白白浪费,也许这就是青春吧,挥霍吧,这不是我想要 ...