在使用DataContractJsonSerializer进行解析之前,我们首先需要将两个包引入进来:

using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

接下来需要新建一个class,DataContractJsonSerializer可以将JSON字符串转化为指定的class或者将class转化为JSON字符串。

这次我接受的JSON数据格式为:

{ "ret": "0", "Isupdate": "1", "Newver": "V1.1.0" }

我们新建的class也要遵照上述格式,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.Serialization;
 
namespace AutoUpdater_Client.Model
{
    //从更新服务器返回的更新信息
    [DataContract]
    class UpdateInfoJSON
    {
        //"{ \"ret\": \"0\", \"Isupdate\": \"1\", \"Newver\": \"V1.1.0\" }";
        //返回值,为0表示获取信息成功
        [DataMember(Order = 0)]
        public int ret { get; set; }
        //是否需要更新,0表示不需要,1表示需要
        [DataMember(Order = 1)]
        public int Isupdate { get; set; }
        //最新版本号
        [DataMember(Order = 2)]
        public string Newver { get; set; }
 
    }
}
请注意上述class中的DataContract和DataMember这两个属性,因为DataContractJsonSerializer在进行序列化的时候需要他们,所以一定要记得加上。
另外,这两个属性的使用也需要引入

System.Runtime.Serialization

接下来我们可以来写解析的代码了:

string result = "{ \"ret\": \"0\", \"Isupdate\": \"1\", \"Newver\": \"V1.1.0\" }";
//解析从服务端返回的JSON结果
var mStream = new MemoryStream(Encoding.Default.GetBytes(result));
var serializer = new DataContractJsonSerializer(typeof(UpdateInfoJSON));
UpdateInfoJSON updateInfo = (UpdateInfoJSON)serializer.ReadObject(mStream);
接下来就可以访问updateInfo中的各个属性了,完成。
————————————————

//*************JSON-DataContractJsonSerializer解析

C#中使用JSON不需要使用第三方库,使用.NET Framwork3.5自带的System.Runtime.Serialization.Json即可很好的完成JSON的解析。

关于JSON的入门介绍见(首页的图很形象):

http://www.json.org/

一、Using

需要添加引用:System.ServiceModel.Web 和 System.Runtime.Serialization,然后使用Using:

using System.Runtime.Serialization.Json;
using System.Runtime.Serialization;

二、定义序列化的类

假如我们要转化的JSON字符串格式为:

{
    "encoding":"UTF-8",
    "plug-ins":["python","c++","ruby"],
    "indent":{
        "length":3,
        "use_space":true
    }
}

然后编写相应的序列化的类,注意下面类加的Attribute:

[DataContract(Namespace = "http://coderzh.cnblogs.com")]
class Config
{
    [DataMember(Order = 0)]
    public string encoding { get; set; }
    [DataMember(Order = 1)]
    public string[] plugins { get; set; }
    [DataMember(Order = 2)]
    public Indent indent { get; set; }
}

[DataContract(Namespace = "http://coderzh.cnblogs.com")]
class Indent
{
    [DataMember(Order = 0)]
    public int length { get; set; }
    [DataMember(Order = 1)]
    public bool use_space { get; set; }
}

三、对象转化为JSON字符串

使用WriteObject方法:


var config = new Config(){
                         encoding = "UTF-8",
                         plugins = new string[]{"python", "C++", "C#"},
                         indent = new Indent(){ length = 4, use_space = false}
                         };
var serializer = new DataContractJsonSerializer(typeof(Config));
var stream = new MemoryStream();
serializer.WriteObject(stream, config);

byte[] dataBytes = new byte[stream.Length];

stream.Position = 0;

stream.Read(dataBytes, 0, (int)stream.Length);

string dataString = Encoding.UTF8.GetString(dataBytes);

Console.WriteLine("JSON string is:");
Console.WriteLine(dataString);

四、JSON字符串转对象

使用ReadObject方法:

ReadObject

五、输出结果:

JSON string is:
{"encoding":"UTF-8","plugins":["python","C++","C#"],"indent":{"length":4,"use_space":false}}
Encoding is: UTF-8
plugins is: python
plugins is: C++
plugins is: C#
indent.length is: 4
indent.use_space is: False

//***********使用List和Json格式相互转化的总结

如Json格式[{"id":"1","name":"sara"},{"id":"2","name":"sara2"}]

自定义数据类型,用于List<>:

 [DataContract]class Person {[DataMember]public int id;[DataMember]public string name;}

程序中使用:

首先加入引用:

using System.Runtime.Serialization.Json;
using System.Runtime.Serialization;
using System.Text;

代码内容:

class Program{static void Main(string[] args){//Product.GetAllSmartPhones();List<Person> nums = new List<Person>();nums.Add(new Person() { id=1,name="sara"});nums.Add(new Person() { id=1,name="sylar"});DataContractJsonSerializer json = new DataContractJsonSerializer(nums.GetType());string szJson = "";//序列化using (MemoryStream stream = new MemoryStream()){json.WriteObject(stream, nums);szJson = Encoding.UTF8.GetString(stream.ToArray());}Console.WriteLine(szJson);Console.ReadLine();}}

工程化时,可以对自定义数据结构重新定义一个类:

如:

public class TestListResult<T> : List<T>
    {
        public TestListResult()
        {
            this.Successed = false;
            this.Message = "";
        }
        public bool Successed { get; set; }
        public string Message { get; set; }
    }

使用时同上在一个文件里一样

理解了以上原理,可以使用以下函数在项目中使用:

List<T>转Json

[html] view plaincopy

  1. public static string Obj2Json<T>(T data)
  2. {
  3. try
  4. {
  5. System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(data.GetType());
  6. using (MemoryStream ms = new MemoryStream())
  7. {
  8. serializer.WriteObject(ms, data);
  9. return Encoding.UTF8.GetString(ms.ToArray());
  10. }
  11. }
  12. catch
  13. {
  14. return null;
  15. }
  16. }

Json转List<T>

[html] view plaincopy

  1. public static Object Json2Obj(String json,Type t)
  2. {
  3. try
  4. {
  5. System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(t);
  6. using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))
  7. {
  8. return  serializer.ReadObject(ms);
  9. }
  10. }
  11. catch
  12. {
  13. return null;
  14. }
  15. }

DataTable 转Json

[html] view plaincopy

  1. public static string DataTable2Json(DataTable dt)
  2. {
  3. if (dt.Rows.Count == 0)
  4. {
  5. return "";
  6. }
  7. StringBuilder jsonBuilder = new StringBuilder();
  8. // jsonBuilder.Append("{");
  9. //jsonBuilder.Append(dt.TableName.ToString());
  10. jsonBuilder.Append("[");//转换成多个model的形式
  11. for (int i = 0; i < dt.Rows.Count; i++)
  12. {
  13. jsonBuilder.Append("{");
  14. for (int j = 0; j < dt.Columns.Count; j++)
  15. {
  16. jsonBuilder.Append("\"");
  17. jsonBuilder.Append(dt.Columns[j].ColumnName);
  18. jsonBuilder.Append("\":\"");
  19. jsonBuilder.Append(dt.Rows[i][j].ToString());
  20. jsonBuilder.Append("\",");
  21. }
  22. jsonBuilder.Remove(jsonBuilder.Length - 1, 1);
  23. jsonBuilder.Append("},");
  24. }
  25. jsonBuilder.Remove(jsonBuilder.Length - 1, 1);
  26. jsonBuilder.Append("]");
  27. //  jsonBuilder.Append("}");
  28. return jsonBuilder.ToString();
  29. }

单个对象转JSON

[html] view plaincopy

  1. public static T Json2Obj<T>(string json)
  2. {
  3. T obj = Activator.CreateInstance<T>();
  4. using (System.IO.MemoryStream ms = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(json)))
  5. {
  6. System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(obj.GetType());
  7. return (T)serializer.ReadObject(ms);
  8. }
  9. }

将函数封装成类,更便于项目中引用:

[html] view plaincopy

  1. public class JsonHelper
  2. {
  3. /// <summary>
  4. /// 生成Json格式
  5. /// </summary>
  6. /// <typeparam name="T"></typeparam>
  7. /// <param name="obj"></param>
  8. /// <returns></returns>
  9. public static string GetJson<T>(T obj)
  10. {
  11. DataContractJsonSerializer json = new DataContractJsonSerializer(obj.GetType());
  12. using (MemoryStream stream = new MemoryStream())
  13. {
  14. json.WriteObject(stream, obj);
  15. string szJson = Encoding.UTF8.GetString(stream.ToArray());
  16. return szJson;
  17. }
  18. }
  19. /// <summary>
  20. /// 获取Json的Model
  21. /// </summary>
  22. /// <typeparam name="T"></typeparam>
  23. /// <param name="szJson"></param>
  24. /// <returns></returns>
  25. public static T ParseFromJson<T>(string szJson)
  26. {
  27. T obj = Activator.CreateInstance<T>();
  28. using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(szJson)))
  29. {
  30. DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
  31. return (T)serializer.ReadObject(ms);
  32. }
  33. }
  34. }

[html] view plaincopy

  1. /// <summary>
  2. /// 反回JSON数据到前台
  3. /// </summary>
  4. /// <param name="dt">数据表</param>
  5. /// <returns>JSON字符串</returns>
  6. public string DataTableToJson(DataTable dt)
  7. {
  8. StringBuilder JsonString = new StringBuilder();
  9. if (dt != null && dt.Rows.Count > 0)
  10. {
  11. JsonString.Append("{ ");
  12. JsonString.Append("\"TableInfo\":[ ");
  13. for (int i = 0; i < dt.Rows.Count; i++)
  14. {
  15. JsonString.Append("{ ");
  16. for (int j = 0; j < dt.Columns.Count; j++)
  17. {
  18. if (j < dt.Columns.Count - 1)
  19. {
  20. JsonString.Append("\"" + dt.Columns[j].ColumnName.ToString() + "\":" + "\"" + dt.Rows[i][j].ToString() + "\",");
  21. }
  22. else if (j == dt.Columns.Count - 1)
  23. {
  24. JsonString.Append("\"" + dt.Columns[j].ColumnName.ToString() + "\":" + "\"" + dt.Rows[i][j].ToString() + "\"");
  25. }
  26. }
  27. if (i == dt.Rows.Count - 1)
  28. {
  29. JsonString.Append("} ");
  30. }
  31. else
  32. {
  33. JsonString.Append("}, ");
  34. }
  35. }
  36. JsonString.Append("]}");
  37. return JsonString.ToString();
  38. }
  39. else
  40. {
  41. return null;
  42. }
  43. }

表的转化Json类:

[html] view plaincopy

  1. public static class JsonTableHelper
  2. {
  3. /// <summary>
  4. /// 返回对象序列化
  5. /// </summary>
  6. /// <param name="obj">源对象</param>
  7. /// <returns>json数据</returns>
  8. public static string ToJson(this object obj)
  9. {
  10. JavaScriptSerializer serialize = new JavaScriptSerializer();
  11. return serialize.Serialize(obj);
  12. }
  13. /// <summary>
  14. /// 控制深度
  15. /// </summary>
  16. /// <param name="obj">源对象</param>
  17. /// <param name="recursionDepth">深度</param>
  18. /// <returns>json数据</returns>
  19. public static string ToJson(this object obj, int recursionDepth)
  20. {
  21. JavaScriptSerializer serialize = new JavaScriptSerializer();
  22. serialize.RecursionLimit = recursionDepth;
  23. return serialize.Serialize(obj);
  24. }
  25. /// <summary>
  26. /// DataTable转为json
  27. /// </summary>
  28. /// <param name="dt">DataTable</param>
  29. /// <returns>json数据</returns>
  30. public static string ToJson(DataTable dt)
  31. {
  32. Dictionary<string, object> dic = new Dictionary<string, object>();
  33. int index = 0;
  34. foreach (DataRow dr in dt.Rows)
  35. {
  36. Dictionary<string, object> result = new Dictionary<string, object>();
  37. foreach (DataColumn dc in dt.Columns)
  38. {
  39. result.Add(dc.ColumnName, dr[dc].ToString());
  40. }
  41. dic.Add(index.ToString(), result);
  42. index++;
  43. }
  44. return ToJson(dic);
  45. }
  46. }

在Asp.net中前后台Json数据的传递

一、前台产生Json数据传递给后台处理

前台生成Json数据要使用javascript和json.js。

json.js 下载地址:http://www.json.org/json.js

前台代码:

[html] view plaincopy

  1. var people = [{ "UserName": "t1", "PassWord": "111111", "Sex": "男" },{ "UserName": "t2", "PassWord": "222222", "Sex": "女" }];
  2. var url = "Default.aspx?people=" + escape(people.toJSONString());
  3. request.open("POST", url, true);
  4. request.onreadystatechange = updatePage;
  5. request.send(null);

后台处理代码:

同上面的转化原理一样,我们先建立一个json数据类,便于List<>中使用。

[html] view plaincopy

  1. [DataContract]//序列化
  2. public class TestObj
  3. {
  4. [DataMember]
  5. public string UserName { get; set; }
  6. [DataMember]
  7. public string PassWord { get; set; }
  8. [DataMember]
  9. public string Sex { get; set; }
  10. public TestObj(string u,string p,string s)
  11. {
  12. UserName = u;
  13. PassWord = p;
  14. Sex = s;
  15. }
  16. }

对前台提交的Json数据相互转化函数

[html] view plaincopy

  1. //json 序列化
  2. public static string ToJsJson(object item)
  3. {
  4. DataContractJsonSerializer serializer = new DataContractJsonSerializer(item.GetType());
  5. using(MemoryStream ms=new MemoryStream())
  6. {
  7. serializer.WriteObject(ms, item);
  8. StringBuilder sb = new StringBuilder();
  9. sb.Append(Encoding.UTF8.GetString(ms.ToArray()));
  10. return sb.ToString();
  11. }
  12. }
  13. //反序列化
  14. public static T FromJsonTo<T>(string jsonString)
  15. {
  16. DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
  17. using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)))
  18. {
  19. T jsonObject = (T)ser.ReadObject(ms);
  20. return jsonObject;
  21. }
  22. }

在后台代码中调用以上函数进行对数据people的处理:

[html] view plaincopy

  1. //获取json字符串
  2. string jsonStr = Request["people"];
  3. List<TestObj> obj = Json.FromJsonTo<List<TestObj>>(jsonStr);
  4. foreach (TestObj item in obj)
  5. {
  6. Response.Write(string.Format("UserName:{0},Password:{1},Sex:{2}/r/n", item.UserName, item.PassWord, item.Sex));
  7. }
  8. Response.End();

最终的结果:

[html] view plaincopy

  1. List<TestObj> Users = new List<TestObj>();
  2. Users.Add(new TestObj("t1", "1", "男"));
  3. Users.Add(new TestObj("t2", "2", "女"));
  4. string json = Json.ToJsJson(Users);
  5. Response.Write(json);
  6. Response.End();

二、前台获取后台提交的Json数据

后台产生Json数据的方法如上原理中提到的:

[html] view plaincopy

  1. string Json;
  2. DataContractJsonSerializer json = new DataContractJsonSerializer(list.GetType());
  3. using (MemoryStream stream = new MemoryStream())
  4. {
  5. json.WriteObject(stream, list);
  6. Json = Encoding.UTF8.GetString(stream.ToArray());
  7. }
  8. return Json;

[html] view plaincopy

  1. /// <summary>
  2. /// Json的数据结构
  3. /// </summary>
  4. [DataContract]
  5. class ResultJson
  6. {
  7. [DataMember]
  8. public bool Result;
  9. [DataMember]
  10. public int Count;
  11. [DataMember]
  12. public string Message;
  13. }

前台获取后台返回的Json字符串:

[html] view plaincopy

  1. function updatePage() {
  2. if (request.readyState == 4) {
  3. if (request.status == 200) {
  4. var response = request.responseText;
  5. //转化成对象
  6. //方法1
  7. response = response.parseJSON();
  8. //方法2
  9. // response = eval("(" + response + ")");
  10. //对象访问方式
  11. document.getElementById("d1").innerHTML = response[1].Sex;
  12. //直接输出
  13. // document.getElementById("d1").innerHTML = response;
  14. }
  15. }
  16. }

复杂的Json字符串操作方法:

假如我们要转化的JSON字符串格式为:

[html] view plaincopy

  1. {
  2. "encoding":"UTF-8",
  3. "plug-ins":["python","c++","ruby"],
  4. "indent":{
  5. "length":3,
  6. "use_space":true
  7. }
  8. }

然后编写相应的序列化的类,注意下面Indent类加的属性:

[html] view plaincopy

  1. [DataContract]
  2. class Config
  3. {
  4. [DataMember(Order = 0)]
  5. public string encoding { get; set; }
  6. [DataMember(Order = 1)]
  7. public string[] plugins { get; set; }
  8. [DataMember(Order = 2)]
  9. public Indent indent { get; set; }
  10. }
  11. [DataContract]
  12. class Indent
  13. {
  14. [DataMember(Order = 0)]
  15. public int length { get; set; }
  16. [DataMember(Order = 1)]
  17. public bool use_space { get; set; }
  18. }

输出JSON字符串

[html] view plaincopy

  1. var config = new Config(){
  2. encoding = "UTF-8",
  3. plugins = new string[]{"python", "C++", "C#"},
  4. indent = new Indent(){ length = 4, use_space = false}
  5. };
  6. var serializer = new DataContractJsonSerializer(typeof(Config));
  7. var stream = new MemoryStream();
  8. serializer.WriteObject(stream, config);
  9. byte[] dataBytes = new byte[stream.Length];
  10. stream.Position = 0;
  11. stream.Read(dataBytes, 0, (int)stream.Length);
  12. string dataString = Encoding.UTF8.GetString(dataBytes);
  13. Console.WriteLine("JSON string is:");
  14. Console.WriteLine(dataString);

结果:

[html] view plaincopy

  1. JSON string is:
  2. {"encoding":"UTF-8","plugins":["python","C++","C#"],"indent":{"length":4,"use_space":false}}

读取Json字符串内容:

[html] view plaincopy

  1. var mStream = new MemoryStream(Encoding.Default.GetBytes(dataString));
  2. Config readConfig = (Config)serializer.ReadObject(mStream);
  3. Console.WriteLine("Encoding is: {0}", readConfig.encoding);
  4. foreach (string plugin in readConfig.plugins)
  5. {
  6. Console.WriteLine("plugins is: {0}", plugin);
  7. }
  8. Console.WriteLine("indent.length is: {0}", readConfig.indent.length);
  9. Console.WriteLine("indent.use_space is: {0}", readConfig.indent.use_space);

结果:

[html] view plaincopy

  1. Encoding is: UTF-8
  2. plugins is: python
  3. plugins is: C++
  4. plugins is: C#
  5. indent.length is: 4
  6. indent.use_space is: False

C#使用DataContractJsonSerializer来进行JSON解析相关推荐

  1. html解释json,json 解析

    这种json怎么解析?[ "1", "2", "3", "4" ] 就是个数组,但json格式化居然显示为合理的. [ ...

  2. android Json解析详解

    JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语 言的支持),从而可以在不同平台间进行数 ...

  3. json解析:[1]gson解析json

    客户端与服务器进行数据交互时,常常需要将数据在服务器端将数据转化成字符串并在客户端对json数据进行解析生成对象.但是用jsonObject和jsonArray解析相对麻烦.利用Gson和阿里的fas ...

  4. spring boot2 修改默认json解析器Jackson为fastjson

    fastjson是阿里出的,尽管近年fasjson爆出过几次严重漏洞,但是平心而论,fastjson的性能的确很有优势,尤其是大数据量时的性能优势,所以fastjson依然是我们的首选:spring ...

  5. 安卓取map集合转换为json_android json解析成map格式

    "discount": { "3": "34", "4": "33", "5": ...

  6. 关于浮点数的json解析

    近期在工作中遇到个问题 通过post请求从其他系统(好像是C#写的)获得json字符串 {"geometry":{"rings":[[[40426489.331 ...

  7. Android Json解析方法

    为什么80%的码农都做不了架构师?>>>    关于Json Json:JavaScript Object Notation Json数据是一系列的键值对集合,相对XML体积小 Js ...

  8. android从服务端获取json解析显示在客户端上面,Android服务端获取json解析显示在客户端上面.doc...

    Android服务端获取json解析显示在客户端上面 Android从服务端获取json解析显示在客户端上面 首先说一下Json数据的最基本的特点,Json数据是一系列的键值对的集合,和XML数据来比 ...

  9. JavaScript语言精粹JSON解析器源码阅读

    1 // 这是一个用JavaScript编写JSON解析器的实现方案: 2 var jsonParser = (function() { 3 // 这是一个能把JSON文本解析成JavaScript数 ...

最新文章

  1. 如何用Git拉取远程分支代码
  2. VMM2012应用指南之2- 准备VMM2012虚拟机
  3. android UI进阶之实现listview的分页加载
  4. FSF 称 DRM 被用于锁定、控制和监视用户
  5. 使用集搜客爬取酷狗排行歌曲信息
  6. strcpy完整版 与 strcpy为什么有返回值
  7. VMware Linux VDI 安装步骤
  8. Oracle数据库驱动包ojdbc7.jar,ojdbc8.jar
  9. webp格式图片如何简单快速转换成JPG、PNG格式
  10. IntelliJ IDEA设置豆沙绿背景
  11. 分治法 —— 循环比赛日程安排表
  12. 如何快速查询大量发票?
  13. kubectl 命令详解(三十一):rollout history
  14. LuaXposed:使用Lua编写Xposed模块
  15. gii无法访问 yii2_Gii的CURD生成无法访问?
  16. python + selenium + unittest 实现网站登录注册自动化测试
  17. 游戏接入SDK系列之org.jf.util.ExceptionWithContext: Unsigned short value out of range
  18. 关于AMD64和arm64、x86和x86_64的介绍
  19. java的声音处理方法
  20. rocksdb配置解析

热门文章

  1. 做方差分析需要正态性检验吗_检验工序要做PFMEA吗?检验如何做PFMEA?
  2. 背景图层和普通图层的区别_ps:图层有多少种类?我已经列出来了,学不学就看你自己了...
  3. python3命令需要使用命令行开发者工具_关于Python3的import问题(pycharm可以运行命令行import错误)...
  4. 理论计算机科学研究生,清华大学理论计算机科学中心姚期智组招收保送研究生,请帮忙发到虎...
  5. 2小时彻底搞懂指针与共用体!
  6. 建一个电赛交流群-大鱼机器人公众号专属
  7. 「权威发布」2019年大学生电子设计竞赛,仪器设备和主要元器件清单
  8. kafka原理_kafka入门(原理搭建简单使用)
  9. oracle 叠加代码写法,利用st_geometry进行图形叠加分析
  10. python电脑截图文字识别软件_Python实现文字识别,来看看大牛怎么实现截图/