JSON 客户端和服务器端的格式转换


Posted in Javascript onAugust 27, 2009

这里我们会从javascript的语法引申出json,并在此基础上引出如何在ajax应用程序上使用JSON。
在javascript大家知道有个Arrays:数组。它的格式如下:

var Beatles = [“Paul”,”John”,”George”,”Ringo”];

上面的实例一个Array的形式和下面的等价:
var Beatles =new Array [ “Paul”,”John”,”George”,”Ringo”];

再有一个就是Objects,对象的创建方式如下:
var Beatles = {“Country”:”England”,”YearFormed”:1959,”Style”:”Rock'n'Roll”}

上面这个创建方式等同于如下的创建方式:
var Beatles = new Object(); 
Beatles.Country = “England”; 
Beatles.YearFormad = 1959; 
Beatles.Style = “Rock'n'Roll”;

同其它javascript对象一样,属性能够通过'.'或'[ ]'来表示出来。
Object可以包含Array, 如下:
var Beatles = { 
“Country” :”England”, 
“YeatFormed”: 1959, 
“Style” : “Rock'n'Roll”, 
“Members”:[ “Paul”,”John”,”George”,”Ringo”] 
}

同样也可以在Array中包含Objects:
var Rockbands =[ 
{ 
“Name”:”BeatLes”, 
“County” : “England”, 
“YearFormed” : 1959, 
“Style” : “Rock'n'Roll”, 
“Members” : [“Paul”,”John”,”George”,”Ringo”] 
}, 
{ 
“Name” “ “Rolling Stones”, 
“Country”:”England”, 
“YearFormed”:1962, 
“Style” : “Rock'n'Roll”, 
“Members” :[“Mick”],”Keith”,”Charlie”,”Bill”] 
} 
]

在JSON的官网上描述JSON如下:
1. 一个轻量级的数据转化形式。
2. 容易人们去读和写。
3. 容易机器去解析和生成。
JSON的语法:
JSON对于一些初级程序员可能觉得不好读和写,但是对于比较有经验的人来说还是相当不错的(个人观点)。
虽然JSON和javascript的语法差不多但是它的每个对象不能够赋值给一个变量。也就是它本身不是哥object而是个字符串。每次得到JSON时我们必须通过转化来使用它。虽然使用javascript的eval()功能能够实现转换,但是为了安全起见建议大家使用json.js来转换。可以到上面提供的那个地址下载。它里面最基本的两个方法:
JSON.parse(strJSON)-是用来转化JSON字符串为JavaScript对象的、
JSON.stringify(objJSON) ?用来转化一个JavaScript对象为一个JSON对象的。
这个是客户端的数据转化,那么服务器端如何进行呢?针对不同的语言会有不同的已经非常好的转换库。因为本人是接近.net的所以这里介绍如何使用C#来进行JSON的服务器端转换。
我看一个外国大哥写了一篇 关于在.net下如何转化JSON的文章相当不错。他把JSON.NET和微软的JavaScriptSerializer集成到一块,这样不管你是哪种格式的JSON基本上都能搞定了、
现提供个简单的转化JSON的生成和解析JSON的代码:
public string Serialize(object value) 
{ 
Type type = value.GetType(); Newtonsoft.Json.JsonSerializer json = new Newtonsoft.Json.JsonSerializer(); 
json.NullValueHandling = NullValueHandling.Ignore; 
json.ObjectCreationHandling = Newtonsoft.Json.ObjectCreationHandling.Replace; 
json.MissingMemberHandling = Newtonsoft.Json.MissingMemberHandling.Ignore; 
json.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; 
if (type == typeof(DataRow)) 
json.Converters.Add(new DataRowConverter()); 
else if(type == typeof(DataTable)) 
json.Converters.Add(new DataTableConverter()); 
else if (type == typeof(DataSet)) 
json.Converters.Add(new DataSetConverter()); 
StringWriter sw = new StringWriter(); 
Newtonsoft.Json.JsonTextWriter writer = new JsonTextWriter(sw); 
if (this.FormatJsonOutput) 
writer.Formatting = Formatting.Indented; 
else 
writer.Formatting = Formatting.None; 
writer.QuoteChar = '"'; 
json.Serialize(writer, value); 
string output = sw.ToString(); 
writer.Close(); 
sw.Close(); 
return output; 
} 
public object Deserialize(string jsonText, Type valueType) 
{ 
Newtonsoft.Json.JsonSerializer json = new Newtonsoft.Json.JsonSerializer(); 
json.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore; 
json.ObjectCreationHandling = Newtonsoft.Json.ObjectCreationHandling.Replace; 
json.MissingMemberHandling = Newtonsoft.Json.MissingMemberHandling.Ignore; 
json.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; 
StringReader sr = new StringReader(jsonText); 
Newtonsoft.Json.JsonTextReader reader = new JsonTextReader(sr); 
object result = json.Deserialize(reader, valueType); 
reader.Close(); 
return result; 
}

在NET.JSON的基础上使用JavascriptSeriazible来转换:
internal class WebExtensionsJavaScriptSerializer : JSONSerializerBase, IJSONSerializer 
{ 
public WebExtensionsJavaScriptSerializer(JSONSerializer serializer) : base(serializer) 
{} public string Serialize(object value) 
{ 
JavaScriptSerializer ser = new JavaScriptSerializer(); 
List<JavaScriptConverter> converters = new List<JavaScriptConverter>(); 
if (value != null) 
{ 
Type type = value.GetType(); 
if (type == typeof(DataTable) || type == typeof(DataRow) || type == typeof(DataSet)) 
{ 
converters.Add(new WebExtensionsDataRowConverter()); 
converters.Add(new WebExtensionsDataTableConverter()); 
converters.Add(new WebExtensionsDataSetConverter()); 
} 
if (converters.Count > 0) 
ser.RegisterConverters(converters); 
} 
return = ser.Serialize(value); 
} 
public object Deserialize(string jsonText, Type valueType) 
{ 
// *** Have to use Reflection with a 'dynamic' non constant type instance 
JavaScriptSerializer ser = new JavaScriptSerializer(); 

object result = ser.GetType() 
.GetMethod("Deserialize") 
.MakeGenericMethod(valueType) 
.Invoke(ser, new object[1] { jsonText }); 
return result; 
} 
} 

internal class WebExtensionsDataTableConverter : JavaScriptConverter 
{ 
public override IEnumerable<Type> SupportedTypes 
{ 
get { return new Type[] {typeof (DataTable)}; } 
} 
public override object Deserialize(IDictionary<string, object> dictionary, Type type, 
JavaScriptSerializer serializer) 
{ 
throw new NotImplementedException(); 
}

下篇介绍如何在ASP.NET的环境下使用JSON和DataTable等的转换,还有介绍使用JQuery的AJAX调用Web Services的生成JSON、相当值得期待。^_^
Javascript 相关文章推荐
document 和 document.all 分别什么时候用
Jun 22 Javascript
实用的Jquery选项卡TAB示例代码
Aug 28 Javascript
查找iframe里元素的方法可传参
Sep 11 Javascript
jQuery的缓存机制浅析
Jun 07 Javascript
JavaScript避免内存泄露及内存管理技巧
Sep 05 Javascript
javascript实现避免页面按钮重复提交
Jan 08 Javascript
bootstrap table小案例
Oct 21 Javascript
基于JavaScript实现的顺序查找算法示例
Apr 14 Javascript
使用AngularJS编写多选按钮选中时触发指定方法的指令代码详解
Jul 24 Javascript
bootstrap modal+gridview实现弹出框效果
Aug 15 Javascript
深入理解ES6 Promise 扩展always方法
Sep 26 Javascript
vue使用$emit时,父组件无法监听到子组件的事件实例
Feb 26 Javascript
动态表格Table类的实现
Aug 26 #Javascript
javascript 函数调用规则
Aug 26 #Javascript
JSON 入门指南 想了解json的朋友可以看下
Aug 26 #Javascript
javascript 继承实现方法
Aug 26 #Javascript
JS去除字符串的空格增强版(可以去除中间的空格)
Aug 26 #Javascript
JavaScript 获取用户客户端操作系统版本
Aug 25 #Javascript
JS 获取span标签中的值的代码 支持ie与firefox
Aug 24 #Javascript
You might like
一个基于PDO的数据库操作类
2011/03/24 PHP
PHP生成plist数据的方法
2015/06/16 PHP
PHP实现页面静态化的超简单方法
2016/09/06 PHP
如何简单地用YUI做JavaScript动画
2007/03/10 Javascript
javascript parseInt 函数分析(转)
2009/03/21 Javascript
js对象关系图 方便dom操作
2012/03/18 Javascript
精心挑选的15个jQuery下拉菜单制作教程
2012/06/15 Javascript
JavaScript中:表达式和语句的区别[译]
2012/09/17 Javascript
JS中获取数据库中的值的方法
2013/07/14 Javascript
jQuery事件之键盘事件(ctrl+Enter回车键提交表单等)
2014/05/11 Javascript
如何防止回车(enter)键提交表单
2014/05/11 Javascript
借助JavaScript脚本判断浏览器Flash Player信息的方法
2014/07/09 Javascript
深入理解JavaScript编程中的同步与异步机制
2015/06/24 Javascript
jQuery Tags Input Plugin(添加/删除标签插件)详解
2016/06/20 Javascript
js css+html实现简单的日历
2016/07/14 Javascript
响应式表格之固定表头的简单实现
2016/08/26 Javascript
基于Node.js + WebSocket打造即时聊天程序嗨聊
2016/11/29 Javascript
SpringMVC+bootstrap table实例详解
2017/06/02 Javascript
Nuxt项目支持eslint+pritter+typescript的实现
2019/05/20 Javascript
解决element-ui里的下拉多选框 el-select 时,默认值不可删除问题
2020/08/14 Javascript
VUE中setTimeout和setInterval自动销毁案例
2020/09/07 Javascript
基于javascript原生判断DOM是否加载完毕
2020/10/14 Javascript
[48:41]VP vs VG Supermajor小组赛 B组胜者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
Python对列表的操作知识点详解
2019/08/20 Python
python图形开发GUI库pyqt5的基本使用方法详解
2020/02/14 Python
Django nginx配置实现过程详解
2020/09/10 Python
python基于opencv实现人脸识别
2021/01/04 Python
香港最大的洋酒零售连锁店:屈臣氏酒窖(Watson’s Wine)
2018/12/10 全球购物
大学生专业个人学习的自我评价
2013/10/26 职场文书
大学毕业生通用自荐信范文
2013/10/31 职场文书
工厂门卫岗位职责
2013/11/25 职场文书
考试退步检讨书
2014/01/15 职场文书
乡镇干部个人对照检查材料思想汇报(原创篇)
2014/09/28 职场文书
2014年维修工作总结
2014/11/22 职场文书
创业计划书之餐饮
2019/09/02 职场文书
vue elementUI批量上传文件
2022/04/26 Vue.js