在程序中任何事物及信息都可以用对象进行描述和承载,除了比较流行的xml之外,还有一种简洁快速处理目标信息的形式那就是Json格式。

首先Json格式有自己固定的格式:例如person这个对象就可以简单的表示成{"name":"xxxx","age":12,"sex":"男"}形式。

Json格式的描述如下:先用{}包含需要表达的对象信息,在{}里使用PropertyName:Value进行对象属性的描述,同时Json字符串可以实现多层嵌套。例如:Json数据:[{PropertyName:Value,PropertyName:Value},{PropertyName:Value,PropertyName:Value}],Json嵌套格式:{PropertyName:Value,PropertyName:{PropertyName:Value,PropertyName:Value}},理论上可以无限嵌套,但是这里建议嵌套最好不要超过3层。

对Json格式有了了解之后,那我们如何在C#中使用Json以及将已经实现的对象与Json联系起来。先个给出几个命名空间

using Newtonsoft.Json;
using System.Runtime.Serialization;
using System.ServiceModel;
using Newtonsoft.Json.Linq;
using System.IO;
using System.Runtime.Serialization.Json;

这里需要注意的是 这些命名空间在 .net3.5及以上本版支持,同时必须在引用中添加 System.Runtime.Serialization.dll的引用。

这里主要使用到的类如下:

JsonSerializer ,StringWriter,StringReader ,JsonWriter,JsonConvert, DataContractJsonSerializer。

1.实现自定义类与Json进行相互转化处理:

    public class Person
{
public Person()
{
}
public Person(string Name, string Sex, int Age, string Address, PersonCharacter Character)
{
this.Name = Name;
this.Sex = Sex;
this.Age = Age;
this.Address = Address;
this.Character = Character;
} public string Name { get; set; } public string Sex { get; set; } public int Age { get; set; } public string Address { get; set; } public PersonCharacter Character { get; set; } } public class PersonCharacter
{ public string Daode { get; set; } public string Wenhua { get; set; } public string Xiuyang { get; set; }
} public void ShowConvert()
{
Person person = new Person("lanar", "男", , "陕西", new PersonCharacter()); JsonSerializer serializer = new JsonSerializer(); StringWriter sw = new StringWriter(); serializer.Serialize(new JsonTextWriter(sw), person ); Console.WriteLine(sw.GetStringBuilder().ToString()); StringReader sr = new StringReader(@"{""Name"":""ppp"", ""Age"":""}"); Person p1 = (Project)serializer.Deserialize(new JsonTextReader(sr), typeof(Person)); Console.WriteLine(p1.Name+ "=>" + p1.Age); }

2. 契约方式:使用System.Runtime.Serialization.dll提供的DataContractJsonSerializer或者 JsonReaderWriterFactory实现

  [DataContract]
public class Person
{
public Person()
{
}
public Person(string Name, string Sex, int Age, string Address, PersonCharacter Character)
{
this.Name = Name;
this.Sex = Sex;
this.Age = Age;
this.Address = Address;
this.Character = Character;
}
[DataMember]
public string Name { get; set; } [DataMember]
public string Sex { get; set; } [DataMember]
public int Age { get; set; } [DataMember]
public string Address { get; set; } [DataMember]
public PersonCharacter Character { get; set; } } public class PersonCharacter
{ public string Daode { get; set; } public string Wenhua { get; set; } public string Xiuyang { get; set; }
} public void ShowConvert()
{
Person person = new Person("许展鹏", "男", , "陕西", new PersonCharacter()); Person p = new Person() { Name = "四大圣地", Age = , Sex = "男", Character = new PersonCharacter() { Daode="sds", Wenhua="dasd", Xiuyang="zzz"} };
DataContractJsonSerializer serializer = new DataContractJsonSerializer(p.GetType());
string jsonText; try
{
using (MemoryStream stream = new MemoryStream())
{
serializer.WriteObject(stream, p);
jsonText = Encoding.UTF8.GetString(stream.ToArray());
Console.WriteLine(jsonText);
} using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonText)))
{
DataContractJsonSerializer serializer1 = new DataContractJsonSerializer(typeof(Person));
Person p1 = (Person)serializer1.ReadObject(ms); }
}
catch (Exception ex )
{ throw new Exception(ex.Message,ex);
}
}

使用契约方式必须在类及相关的属性添加相关的契约修饰符: [DataContract], [DataMember] 内嵌的对象内部可以不用添加契约修饰符号的。

以上只是最常用的应用方式,对于有特殊需求的实现可以使用第三方实现的json转换类进行处理。在web页面可以使用   引入System.Web.Script.Serialization命名空间使用 JavaScriptSerializer类实现简单的序列化。

JSON官网:http://www.json.org/json-zh.html

独立JSON序列化:http://msdn.microsoft.com/zh-cn/library/bb412170.aspx

如何对JSON序列化和反序列化:http://msdn.microsoft.com/zh-cn/library/bb412179.aspx

最新文章

  1. Datazen自定义地图
  2. 基于Ruby的Watir-WebDriver自动化测试框架
  3. (译)如何优化cocos2d程序的内存使用和程序大小:第二部分(完)
  4. 常用的Expression调用形式
  5. android中TimePicker和DatePicker的简单使用
  6. [Xcode使用 - 4] 真机调试配置
  7. node.js在windows下的学习笔记(2)---简单熟悉一些命令
  8. Linux下载jdk ,Linux如何下载jdk
  9. 在线服装零售商Betabrand获得650万美元风投 - 投资风向 - 创业邦
  10. Ubuntu纯字符界面的一些设置
  11. Vijos 1033 整数分解(版本2)
  12. 【SqlServer系列】JSON数据
  13. DOS、Mac 和 Unix 文件格式[转]
  14. 复习上学期的HTML+CSS(1)
  15. Android 上滑上拉菜单SlidingDrawer 不全屏显示的方法
  16. 网络学习day04_VLSM、子网划分
  17. java笔记 -- 输入输出
  18. vue axios数据请求get、post方法的使用
  19. spring boot +mybatis 整合 连接数据库测试(从0到1)
  20. RK3288 mipi屏参数配置文件

热门文章

  1. HDU2037 贪心 动归均可+证明
  2. PPTP协议握手流程分析
  3. linux进程间通信之管道篇
  4. 使用Jquery UI 高仿百度搜索下拉列表功能
  5. 005 列表以及append,extend方法
  6. stringstream函数(i o)
  7. 安装windows7和ubuntu双系统后引导项设置
  8. 层次节点——NODE节点
  9. git 快速使用(本地仓库同步到远程仓库)
  10. iOS项目生成通用Windows应用