C#中Json字符串的各种应用类实例讲解

 更新时间:2015年10月16日 13:48:26   投稿:mrr  
这篇文章主要介绍了C#中Json字符串的各种应用类实例讲解的相关资料,需要的朋友可以参考下

在程序中任何事物及信息都可以用对象进行描述和承载,除了比较流行的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", "男", 24, "陕西", 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"":"12"}");
Person p1 = (Project)serializer.Deserialize(new JsonTextReader(sr), typeof(Person));
Console.WriteLine(p1.Name+ "=>" + p1.Age);
}

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

 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.UTF.GetString(stream.ToArray());
           Console.WriteLine(jsonText);
         }
         using (MemoryStream ms = new MemoryStream(Encoding.UTF.GetBytes(jsonText)))
         {
           DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Person));
           Person p = (Person)serializer.ReadObject(ms);
         }
       }
       catch (Exception ex )
       {
         throw new Exception(ex.Message,ex);
       }
     }

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

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

相关文章

  • C# 设计模式系列教程-抽象工厂模式

    C# 设计模式系列教程-抽象工厂模式

    抽象工厂模式为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
    2016-06-06
  • 关于C#反射 你需要知道的

    关于C#反射 你需要知道的

    这篇文章主要介绍了C#反射的相关知识,文中讲解的非常详细,代码帮助大家更好的参考学习,感兴趣的朋友可以了解下
    2020-06-06
  • dotNet中的反射用法入门教程

    dotNet中的反射用法入门教程

    这篇文章主要介绍了dotNet中的反射用法,较为详细的分析了.Net中关于反射的概念,使用方法与相关注意事项,需要的朋友可以参考下
    2016-02-02
  • C#创建临时文件的方法

    C#创建临时文件的方法

    这篇文章主要介绍了C#创建临时文件的方法,涉及C#中Path.GetTempFileName方法获取与操作临时文件的使用技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • C# 如何获取当前进程或线程的ID

    C# 如何获取当前进程或线程的ID

    这篇文章主要介绍了C# 如何获取当前进程或线程的ID,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • C#实现自定义光标并动态切换

    C#实现自定义光标并动态切换

    这篇文章主要为大家详细介绍了如何利用C#语言实现自定义光标、并动态切换光标类型,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-07-07
  • c#值类型和引用类型使用示例

    c#值类型和引用类型使用示例

    这篇文章主要介绍了c#值类型和引用类型使用示例,需要的朋友可以参考下
    2014-04-04
  • 使用C#实现自己封装的Modbus工具类库

    使用C#实现自己封装的Modbus工具类库

    Modbus通讯协议在工控行业的应用是很多的,并且也是上位机开发的基本技能之一,所以本文主要为大家介绍了如何使用C#封装一个Modbus工具类库,需要的可以参考下
    2024-02-02
  • C# [ImportDll()] 知识小结

    C# [ImportDll()] 知识小结

    今天小编就为大家分享一篇关于C# [ImportDll()] 知识小结,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • C#开发Windows UWP系列之布局面板RelativePanel

    C#开发Windows UWP系列之布局面板RelativePanel

    这篇文章介绍了C#开发Windows UWP系列之布局面板RelativePanel,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06

最新评论