上一篇Newtonsoft.Json高级用法发布以后收到挺多回复的,本篇将分享几点挺有用的知识点和最近项目中用到的一个新点进行说明,做为对上篇文章的补充。
阅读目录
动态改变属性序列化名称
"动态改变属性序列化名称"顾名思义:在不同场景下实体字段序列化后字段名称不同,比如有下面实体A,正常序列化后json为{"Id":"123"}
publicclass A {publicstring Id {get;set; } }
现在有两种新场景A场景下 字段Id需要序列化为Key,B场景下字段Id需要序列化为id,那么如何在不改变实体代码情形下完成该功能呢?下面以树形结构数据为例子进行讲解。
各种各样的前端树形控件所要求数据格式不一样,下面列举几种常见的树形控件数据格式。
//bootstrap treeview,数据结构为[ { id:'1',//节点id text: '父节点',//节点显示文本 icon: 'glyphicon glyphicon-cloud-download',//节点图标样式 nodes:[{id:'2',text:'子节点'}]//子节点 } ] //zTree[ {"id" : "1", "name" : "父节点1", "children" : [{id:'4',name:'子节点1'}] }, {"id" : "2", "name" : "父节点2", "children" : [{id:'5',name:'子节点2'}] }, {"id" : "3", "name" : "父节点3", "children" : [{id:'6',name:'子节点3'}] } ]
两者之间字段对比

treeviewzTree
节点ididid
显示文本textname
图标iconicon
子节点nodeschildren

标红部分是数据格式区别,假设后台定义的树形实体如下
////// 树形实体///publicclass Tree {////// 当前ID///publicstring Id {get;set; }////// 文本///publicstring Text {get;set; }////// 附加信息///publicstring Tag {get;set; }////// 节点图标///publicstring Icon {get;set; }////// 子级///public ListChildrens {get;set; } }
现在的情形是这样的,后台树形实体已经定义完成,前台树形控件使用的是treeview。有什么办法使后台序列化返回的json数据格式和控件所要求的保持一致呢。
方法一 修改实体Tree
////// 树形实体///publicclass Tree {////// 当前ID///publicstringid {get;set; }////// 文本///publicstringtext {get;set; }////// 附加信息///publicstring Tag {get;set; }////// 节点图标///publicstring Icon {get;set; }////// 子级///public Listnodes {get;set; } }
其中标红部分是修改的,当然还需要修改对Tree实体赋值的代码,这里就不列出了。
方法二 前台js处理
var data=[ {"Id":"1","Text":"父节点1","Childrens":[ {"Id":"3","Text":"子节点1","Childrens":[{"Id":"5","Text":"子节点1-1"}]}, {"Id":"4","Text":"子节点2"} ]}, {"Id":"2","Text":"父节点2","Childrens":[ {"Id":"5","Text":"子节点3"} ]}]//将后台返回数据转换成treeview所需格式数据 handleChild(data); console.log(data);//转换后台实体数据为treeview符合的数据格式function handleChild(childs){for(var i=0,length=childs.length;i