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 相关文章推荐
accesskey 提交
Jun 26 Javascript
javascript 屏蔽鼠标键盘的几段代码
Jan 02 Javascript
使用JQuery快速实现Tab的AJAX动态载入(实例讲解)
Dec 11 Javascript
CSS中position属性之fixed实现div居中
Dec 14 Javascript
request请求获取参数的实现方法(post和get两种方式)
Sep 27 Javascript
jQuery实现Select下拉列表进行状态选择功能
Mar 30 jQuery
JavaScript仿微信(电话)联系人列表滑动字母索引实例讲解(推荐)
Aug 16 Javascript
input 标签实现输入框带提示文字效果(两种方法)
Oct 09 Javascript
vue轮播图插件vue-concise-slider的使用
Mar 13 Javascript
ES6 Promise对象的含义和基本用法分析
Jun 14 Javascript
uni-app使用微信小程序云函数的步骤示例
May 22 Javascript
javascript实现多边形碰撞检测
Oct 24 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
WinXP + Apache +PHP5 + MySQL + phpMyAdmin安装全功略
2006/07/09 PHP
PHP注释实例技巧
2008/10/03 PHP
php获取url字符串截取路径的文件名和扩展名的函数
2010/01/22 PHP
PHP中json_encode、json_decode与serialize、unserialize的性能测试分析
2010/06/09 PHP
应用开发中涉及到的css和php笔记分享
2011/08/02 PHP
PHP实现指定字段的多维数组排序函数分享
2015/03/09 PHP
Yii框架扩展CGridView增加导出CSV功能的方法
2017/05/24 PHP
php微信公众号开发之关键词回复
2018/10/20 PHP
javascript 操作select下拉列表框的一点小经验
2010/03/20 Javascript
js新闻滚动 js如何实现新闻滚动效果
2013/01/07 Javascript
如何学习Javascript入门指导
2013/11/01 Javascript
基于jQuery和hwSlider实现内容左右滑动切换效果附源码下载(一)
2016/06/22 Javascript
js实现分页功能
2017/05/24 Javascript
JavaScript使用FileReader实现图片上传预览效果
2020/03/27 Javascript
webpack4之SplitChunksPlugin使用指南
2018/06/12 Javascript
Vue项目部署的实现(阿里云+Nginx代理+PM2)
2019/03/26 Javascript
详解Vue前端对axios的封装和使用
2019/04/01 Javascript
[02:17]2016国际邀请赛中国区预选赛VG战队领队采访
2016/06/26 DOTA
[59:53]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第二场 3月6日
2021/03/11 DOTA
python 提取文件的小程序
2009/07/29 Python
python通过exifread模块获得图片exif信息的方法
2015/03/16 Python
pandas使用get_dummies进行one-hot编码的方法
2018/07/10 Python
pandas 转换成行列表进行读取与Nan处理的方法
2018/10/30 Python
解决Python安装时报缺少DLL问题【两种解决方法】
2019/07/15 Python
django框架中ajax的使用及避开CSRF 验证的方式详解
2019/12/11 Python
python函数map()和partial()的知识点总结
2020/05/26 Python
python 元组和列表的区别
2020/12/30 Python
车间主管岗位职责
2013/11/14 职场文书
《草原》教学反思
2014/02/15 职场文书
安全生产计划书
2014/05/04 职场文书
十岁生日答谢词
2015/01/05 职场文书
初中政治教师教学反思
2016/02/23 职场文书
导游词之上海杜莎夫人蜡像馆
2019/11/22 职场文书
css3 利用transform-origin 实现圆点分布在大圆上布局及旋转特效
2021/04/29 HTML / CSS
Nginx location 和 proxy_pass路径配置问题小结
2021/09/04 Servers
TypeScript中条件类型精读与实践记录
2021/10/05 Javascript