今天在遇到这么个问题,项目上有一部分功能需要访问web api, 这个api请求和相应的数据格式都是使用JSON,JSON中的field命名方式是以下划线分割的,比如"project_name", "account_id"等等。但是在C#中命名方式一般都为Camel-Case,这样如果使用Json.NET的默认设置序列化和反序列化对象的话就造成属性名不一致的情况。

这时,我们就可以通过Json.NET中的ContractResolver来实现实现属性的映射,比如将ProjectName映射为project_name:

  1. public class UnderlineSplitContractResolver : DefaultContractResolver
  2. {
  3. protected override string ResolvePropertyName(string propertyName)
  4. {
  5. return CamelCaseToUnderlineSplit(propertyName);
  6. }
  7.  
  8. private string CamelCaseToUnderlineSplit(string name)
  9. {
  10. StringBuilder builder = new StringBuilder();
  11. for (int i = ; i < name.Length; i++)
  12. {
  13. var ch = name[i];
  14. if (char.IsUpper(ch) && i > )
  15. {
  16. var prev = name[i - ];
  17. if (prev != '_')
  18. {
  19. if (char.IsUpper(prev))
  20. {
  21. if (i < name.Length - )
  22. {
  23. var next = name[i + ];
  24. if (char.IsLower(next))
  25. {
  26. builder.Append('_');
  27. }
  28. }
  29. }
  30. else
  31. {
  32. builder.Append('_');
  33. }
  34. }
  35. }
  36.  
  37. builder.Append(char.ToLower(ch));
  38. }
  39.  
  40. return builder.ToString();
  41. }
  42. }

代码中我继承了Json.NET中的DefaultContractResolver类,并且重写了ResolvePropertyName方法,在方法内部将以Camel-Case方式命名的属性名转换为以下划线分割的方式。

接着,使用UnderlineSplitContractResolver替代默认的DefaultContractRelover就可以达到想要的效果:

  1. var settings = new JsonSerializerSettings
  2. {
  3. ContractResolver = new UnderlineSplitContractResolver()
  4. };
  5.  
  6. var project = new Project(){ ProjectName = "test" };
  7. var json = JsonConvert.SerializeObject(project, settings);
  8. Console.WriteLine(json); //{ “project_name”: "test" }
  9.  
  10. project = JsonConvert.DeserializeObject<Project>(json, settings);
  11. Console.WriteLine(project.ProjectName); //test

通过无论是序列化还是反序列化都达到了效果,即:ProjectName -> project_name 和 project_name -> ProjectName

Json.NET 利用ContractResolver解决命名不一致问题的更多相关文章

  1. 利用Readability解决网页正文提取问题

    分享: 利用Readability解决网页正文提取问题   做数据抓取和分析的各位亲们, 有没有遇到下面的难题呢? - 如何从各式各样的网页中提取正文!? 虽然可以用SS为各种网站写脚本做解析, 但是 ...

  2. 利用gulp解决微信浏览器缓存问题

    做了好多项目,这次终于要解决微信浏览器缓存这个令人头疼的问题了.每次上传新的文件,在微信浏览器中访问时,总要先清除微信的缓存,实在麻烦,在网上搜罗了很多解决办法,终于找到了方法:利用gulp解决缓存问 ...

  3. 利用闭包解决for循环里onclick事件不能捕捉实时i值问题

    问题描述 我们都知道,如果我们对于一组元素(相同的标签)同时进行onclick事件处理的时候(在需要获取到索引的时候),一般是写一个for循环,但是onclick是一个异步调用的,所以会带来一个问题, ...

  4. Java环境变量配置&解决版本不一致问题

    之前用Myeclipse编译运行Java没有问题 但是突然想用简单点的NotePad++以及cmd直接编译运行Java 这就让我倒腾了一晚上 先说下问题的解决,再总结下查阅的一些知识. 1.进行win ...

  5. JavaScript发展史,与JScript差别,引入方式,数据类型,命名规范,命名推荐,解决命名冲突

    文件夹: 1.JavaScript发展史 2.JavaScript与JScript差别 3.JavaScript引入方式 4.JavaScript基本数据类型及布尔值 5.JavaScript命名规范 ...

  6. jQuery源码研究——解决命名冲突

    在项目中难免不去使用多个插件,如此一来这些插件就有可能出现一样的名称,当出现同名变量时后一个将会覆盖上一个,这样的话我们就无法同时使用多个插件了. 当遇到这种情况我们可以手动去修改插件源码把它的名字改 ...

  7. 利用Json_encode解决中文问题

    利用Json_encode解决中文问题       public function return_json($data=array()){         echo json_encode($data ...

  8. 利用JNDI的命名与服务功能来满足企业级API对命名与服务的访问

    包含了大量的命名和目录服务,使用通用接口来访问不同种类的服务: 可以同时连接到多个命名或目录服务上: 建立起逻辑关联,允许把名称同Java对象或资源关联起来,而不必知道对象或资源的物理ID. JNDI ...

  9. 利用Filter解决跨域请求的问题

    1.为什么出现跨域. 很简单的一句解释,A系统中使用ajax调用B系统中的接口,此时就是一个典型的跨域问题,此时浏览器会出现以下错误信息,此处使用的是chrome浏览器. 错误信息如下: jquery ...

随机推荐

  1. LeetCode:Pascal's Triangle I II

    LeetCode:Pascal's Triangle Given numRows, generate the first numRows of Pascal's triangle. For examp ...

  2. mysql命令行

    mysql -u root -p create database bookstore; drop database bookstore; use bookstore create table user ...

  3. HDU5336-XYZ and Drops-模拟

    模拟水珠那个游戏. 小水珠超过边界会消失. 会有两个水珠同时到达一个size=4大水珠的情况.要移动完统一爆炸 #include <vector> #include <cstdio& ...

  4. 20145208《Java程序设计》第2周学习总结

    2015208 <Java程序设计>第2周学习总结 教材学习内容总结 本章内容主要讲了类型.变量与运算符的一些知识,也讲了一些基本的流程语法. 类型 基本类型 整数:short整数(占2字 ...

  5. 老爷车IE8如何兼容图标字体

    前言 首先这个标题再详细的说就是如何解决font-face在IE8下间歇性出现图标字体渲染失败的解决方案. 如果你还不知道什么是图标字体,可以先阅读:链接1,链接2,链接3 先看在IE8下的问题: 而 ...

  6. Android新组件RecyclerView介绍,其效率更好

    今天我们首先来说为什么要介绍这个新组件RecyclerView,因为前几天我发布了一个常用面试题ListView的复用及如何优化的文章,介绍给一些开发者,但是我看到有关的反馈说:现在都不再用listv ...

  7. python3 入门 (二) 列表的使用

    列表用于组织其它数值,即写在方括号之间.用逗号分隔开的数值列表.列表内的项目不必全是相同的类型. 列表的定义 student = ['Tom', 'Jack', 'Avril'] 添加元素 将另一个列 ...

  8. 开放封闭原则(OCP,Open Closed Principle)

    tks:http://www.cnblogs.com/Benjamin/p/3251987.html

  9. windows Server2008R2 每隔一段时间自动关机解决办法

    情况描述: “我的电脑-->右键属性”中显示“已激活”,而“管理工具”中显示未激活.系统中有进程wlms.exe. 网上找了下解决方式: 1.提权工具:PSTOOLS(下载地址:http://m ...

  10. 关于OOM那些事儿

    最近在aliyun上crontab里放的一个java脚本把机器搞翻了,ssh连不上T_T 发现OOM了,真是无语.并不懂Java的内存模型,转一篇备用吧. 转载自:http://www.cnblogs ...