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 相关文章推荐
jquery插件jbox使用iframe关闭问题
Feb 09 Javascript
javascript 仿QQ滑动菜单效果代码
Sep 03 Javascript
Jquery EasyUI中弹出确认对话框以及加载效果示例代码
Feb 13 Javascript
js实现照片墙功能实例
Feb 05 Javascript
基于jQuery实现以手风琴方式展开和折叠导航菜单
Jan 28 Javascript
JavaScript实现的冒泡排序法及统计相邻数交换次数示例
Apr 26 Javascript
JavaScript内置对象math,global功能与用法实例分析
Jun 10 Javascript
小程序click-scroll组件设计
Jun 18 Javascript
js实现课堂随机点名系统
Nov 21 Javascript
原生javascript单例模式的应用实例分析
Feb 23 Javascript
js在HTML的三种引用方式详解
Aug 29 Javascript
详解如何在vue+element-ui的项目中封装dialog组件
Dec 11 Vue.js
动态表格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
浅析php中抽象类和接口的概念以及区别
2013/06/27 PHP
php函数实现判断是否移动端访问
2015/03/03 PHP
摘自织梦CMS中的图片处理类
2015/08/08 PHP
PHP中quotemeta()函数的用法讲解
2019/04/04 PHP
php转换上传word文件为PDF的方法【基于COM组件】
2019/06/10 PHP
跨浏览器的设置innerHTML方法
2006/09/18 Javascript
js字符编码函数区别分析
2011/12/28 Javascript
Javascript中 关于prototype属性实现继承的原理图
2013/04/16 Javascript
jquery对ajax的支持介绍
2013/12/10 Javascript
jQuery实现的一个自定义Placeholder属性插件
2014/08/11 Javascript
javascript实现依次输入input自动定焦
2014/12/23 Javascript
JavaScript中innerHTML,innerText,outerHTML的用法及区别
2015/09/01 Javascript
Javascript验证方法大全
2015/09/21 Javascript
Javascript 6里的4个新语法
2016/08/25 Javascript
Websocket协议详解及简单实例代码
2016/12/12 Javascript
使用vue和datatables进行表格的服务器端分页实例代码
2017/06/07 Javascript
解决iView中时间控件选择的时间总是少一天的问题
2018/03/15 Javascript
vue-router的使用方法及含参数的配置方法
2018/11/13 Javascript
JavaScript 严格模式(use strict)用法实例分析
2020/03/04 Javascript
Openlayers测量距离与面积的实现方法
2020/09/25 Javascript
JS相册图片抖动放大展示效果的示例代码
2021/01/29 Javascript
[02:01]大师之路——DOTA2完美大师赛11月论剑上海
2017/11/06 DOTA
Python实现的远程登录windows系统功能示例
2018/06/21 Python
numpy和pandas中数组的合并、拉直和重塑实例
2019/06/28 Python
通过python改变图片特定区域的颜色详解
2019/07/15 Python
python join方法使用详解
2019/07/30 Python
通过Turtle库在Python中绘制一个鼠年福鼠
2020/02/03 Python
在 Pycharm 安装使用black的方法详解
2020/04/02 Python
Python 合并拼接字符串的方法
2020/07/28 Python
HTML5实现桌面通知 提示功能
2017/10/11 HTML / CSS
介绍一下javax.servlet.Servlet接口及其主要方法
2015/11/30 面试题
感恩教育月活动总结
2014/07/07 职场文书
课程设计的心得体会
2014/09/03 职场文书
Python包argparse模块常用方法
2021/06/04 Python
python-opencv 中值滤波{cv2.medianBlur(src, ksize)}的用法
2021/06/05 Python
手写Spirit防抖函数underscore和节流函数lodash
2022/03/22 Javascript