当前位置: 移动技术网 > IT编程>开发语言>c# > C#中Json字符串的各种应用类实例讲解

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

2019年07月18日  | 移动技术网IT编程  | 我要评论

在程序中任何事物及信息都可以用对象进行描述和承载,除了比较流行的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类实现简单的序列化。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网