欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-02-21 15:15:12
在程序中任何事物及信息都可以用对象进行描述和承载,除了比较流行的xml之外,还有一种简洁快速处理目标信息的形式那就是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类实现简单的序列化。