C#在Json反序列化中处理键的特殊字符

    • 假设有如下Json 数据:

      view sourceprint?

      1.{

      2."id" : 1,

      3."@value" "this a @",

      4."$p" "my name a $"

      5.}

      通常情况下,在Json反序列化时,将Json映射到序列化的类,无需指定其名称。如

      view sourceprint?

      1.public JsonTest{

      2.public string id{get;set;}

      3.}

      在反序列化时会自动将Json中的ID与类中的ID对应。

      但是当键有特殊字符时,如 $ , @ 等,无法定义类的属性中含有特殊字符,

      因此,需要使用 [DataContract] 和 [DataMember] 来定义数据协定

      view sourceprint?

      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.}

      反序列化

      view sourceprint?

      1.jtest test = serializer.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes(jsonStr))) as jtest;

      2.Console.WriteLine( test.value );

      序列化

      view sourceprint?

      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);

      完整测试类:

      view sourceprint?

      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.}

时间: 2024-10-12 20:02:53

C#在Json反序列化中处理键的特殊字符的相关文章

C# 正则表达式获取json字符串中的键值

//定义正则表达式,解析得到  [ 与 ] 之间的内容,内容包括 [ 和 ]            //要注意这个 .*? 的写法, 附加的问号是表示尽可能短匹配,这很重要,否则返回最长匹配            string patttern = @"([).*?(])"; //解析得到 [ 与 ] 之间内容,保存在 match 中            Match match = Regex.Match(jsonString, patttern, RegexOptions.Igno

【iOS开发-95】JSON反序列化、XML数据解析以及主线程中的UI更新等小细节

我们发送请求后,一般会获得data数据,这个时候我们反序列化即可. 常用的数据格式之一是JSON,格式如: {key:value,key:value,key:value....} (1)因为iOS5之前苹果不支持JSON解析,所以催生很多第三方解析,SBJson以及JSONKit.简单地JSON反序列化示例如下: NSURL *url=[NSURL URLWithString:@"http://www.baidu.com"]; NSURLRequest *request=[NSURLR

c# 通过json.net中的JsonConverter进行自定义序列化与反序列化

相信大家在工作中会经常遇见对json进行序列化与反序列化吧,但通常的序列化与反序列化中的json结构与c#中的类模型结构是相对应的,我们是否可以在序列化一个对象时候,让我们json的数据结构能按照自己的意愿,而不必与该对象的数据结构一样呢?,比如说,一个对象,只有一个名为"ID"的int类型的属性,值为1,如果序列化该对象,则能得到json:{"ID":1},但我现在希望得到的json的"ID"值是bool类型:{"ID":t

ios 解决数据请求json解析字典后,由于java某些类库转换json字符串后出现键值为<null>无法保存在userDefault的问题

解决数据请求json解析字典后,由于java某些类库转换json字符串后出现键值为<null>无法保存在userDefault. 打印下得到的字典数据: “username”=<null> 此时如果将字典保存到userDefault中会报错 所以需要遍历字典将其替换 for (NSString*s in [Dict1 allKeys]) { if ([Dict1[s] isEqual:[NSNull null]]) { [Dict1 setObject:@""

.net2.0 C# Json反序列化

去:http://json.codeplex.com/下载 Json.NET 1.3.1(.net2.0用) Json.net API:http://james.newtonking.com/projects/json/help/ 解压吧BIN文件拷贝到项目的BIN文件中(我就考那Newtonsoft.Json.dll 配置的xml文件没拷还没知道这么用) 反序列化:(就是把JSON取出来赋予C#然后操作数据 我是这样理解的) 代码: using Newtonsoft.Json;//导入类 st

mvc使用Newtonsoft.Json反序列化json数据

mvc中默认使用的json返回序列化工具是JsonValueProviderFactory,JsonValueProviderFactory继承自ValueProviderFactory抽象类.JsonValueProviderFactory使用的序列化类库是System.Web.Script.Serialization.现在我们来写一个自己的方序列话工具,采用的是Newtonsoft.Json序列化和反序列化工具. JsonValueProviderFactory代码具体如下: using S

解决VNC中tab键无效的方法

http://ubuntuforums.org/archive/index.php/t-1771058.html I accidentally discovered a fix for this while trying to solve a different problem.edit~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xmlfind the line <property name="&l

NSMutableDictionary 类中增加键值对方法分析

在iOS中可变字典增加一个键值对的方法有setObject: forKey: 和setValue : forKey: .为了方便我们把这两个方法简称为方法A和方法B. B这个方法中其中的value值是不能为nil,否则程序会出项崩溃.而A方法中的这个value可以为nil,但是当这个value位nil时,系统会自动调用removeObjectforKey:这个方法.这样就把这个键值对删除掉了.B方法中的key值可以是任意类型的,但是这个类型必须要实现NSCopying协议.而A方法中它的key值

Oracle Sqlplus中上下键出现^[[A乱码问题

安装rlwrap 下载:http://utopia.knoware.nl/~hlub/uck/rlwrap/ 或者 百度云盘:http://pan.baidu.com/s/1ntM8YXr 需要先安装readline,否则会报一下错误:You need the GNU readline library(ftp://ftp.gnu.org/gnu/readline/ ) to build this program! 如下: [[email protected] ~]# cd /opt/ [[ema