博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#在Json反序列化中处理键的特殊字符
阅读量:6948 次
发布时间:2019-06-27

本文共 2244 字,大约阅读时间需要 7 分钟。

    • 假设有如下Json 数据:

       

      1.
      {
      2.
      "id" : 1,
      3.
      "@value" "this a @",
      4.
      "$p" "my name a $"
      5.
      }
      通常情况下,在Json反序列化时,将Json映射到序列化的类,无需指定其名称。如
      1.
      public JsonTest{
      2.
      public string id{
      get;set;}
      3.
      }
      在反序列化时会自动将Json中的ID与类中的ID对应。
      但是当键有特殊字符时,如 $ , @ 等,无法定义类的属性中含有特殊字符,
      因此,需要使用 [DataContract] 和 [DataMember] 来
      定义数据协定
      01.
      [DataContract]
      02.
      public class jtest
      03.
      {
      04.
      [DataMember(Order = 0)]
      05.
      public int id { getset; }
      06.
      [DataMember(Order = 1, Name = "@value")]
      07.
      public string value { getset; }
      08.
      [DataMember(Order = 2, Name = "$p")]
      09.
      public string _p { getset; }
      10.
      }
      反序列化
      1.
      jtest test = serializer.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes(jsonStr))) as jtest;
      2.
      Console.WriteLine( test.value );
      序列化
      1.
      var stream = new MemoryStream();
      2.
      serializer.WriteObject(stream, test);
      3.
      byte[] dataBytes = new byte[stream.Length];
      4.
      stream.Position = 0;
      5.
      stream.Read(dataBytes, 0, (int)stream.Length);
      6.
      string dataString = Encoding.UTF8.GetString(dataBytes);
      完整测试类:
      01.
      using System;
      02.
      using System.Text;
      03.
      using System.Runtime.Serialization;
      04.
      using System.Runtime.Serialization.Json;
      05.
      using System.IO;
      06.
       
      07.
       
      08.
      namespace ConsoleApplication1
      09.
      {
      10.
      class Program
      11.
      {
      12.
      static void Main(string[] args)
      13.
      {
      14.
      string jsonStr = "{\"id\":1,\"@value\":\"this a @\",\"$p\":\"my name a $\"}";
      15.
      DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(jtest));
      16.
       
      17.
      //反序列化
      18.
      jtest test = serializer.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes(jsonStr))) as jtest;
      19.
      Console.WriteLine( test.value );
      20.
       
      21.
      //序列化
      22.
      var stream = new MemoryStream();
      23.
      serializer.WriteObject(stream, test);
      24.
      byte[] dataBytes = new byte[stream.Length];
      25.
      stream.Position = 0;
      26.
      stream.Read(dataBytes, 0, (int)stream.Length);
      27.
      string dataString = Encoding.UTF8.GetString(dataBytes);
      28.
       
      29.
      Console.WriteLine(dataString);
      30.
      Console.ReadKey();
      31.
      }
      32.
      }
      33.
      [DataContract]
      34.
      public class jtest
      35.
      {
      36.
      [DataMember(Order = 0)]
      37.
      public int id { getset; }
      38.
      [DataMember(Order = 1, Name = "@value")]
      39.
      public string value { getset; }
      40.
      [DataMember(Order = 2, Name = "$p")]
      41.
      public string _p { getset; }
      42.
      }
      43.
      }

转载于:https://www.cnblogs.com/zcm123/p/4228101.html

你可能感兴趣的文章
PCIE协议解析 synopsys IP loopback 读书笔记(1)
查看>>
创建maven工程的时候卡死的解决办法
查看>>
Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法
查看>>
微信小程序保存图片功能实现
查看>>
【Shiro】小读Shiro Filter(未完待续)
查看>>
Android环信即时通讯集成坑爹 注册报错208解决
查看>>
Flink及主流流框架spark,storm比较
查看>>
mysql按位的索引判断位的值
查看>>
一套简约漂亮的响应式博客园主题皮肤
查看>>
js获取时间戳
查看>>
Java数据结构和算法(四):栈
查看>>
为什么我的mac插入耳机耳机没有声音呢?
查看>>
ArcGIS js api 手动构建FeatureLayer
查看>>
Spark RDD持久化、广播变量和累加器
查看>>
Exception in thread "main" javax.validation.ValidationException: Unable to find a default provider
查看>>
Step by step SQL Server 2012的安装
查看>>
使用using 语句
查看>>
爱的十个秘密--5.友谊的力量
查看>>
(原創) 如何破解Quartus II 8.0 SP1? (SOC) (Quartus II) (Nios II)
查看>>
AspNetPager分页控件之url重写
查看>>