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 相关文章推荐
JavaScript 编程引入命名空间的方法
Jun 29 Javascript
JavaScript Function函数类型介绍
Apr 08 Javascript
jQuery实现的向下图文信息滚动效果
May 03 Javascript
jQuery插件imgPreviewQs实现上传图片预览
Jan 15 Javascript
JavaScript File API实现文件上传预览
Feb 02 Javascript
js提交form表单,并传递参数的实现方法
May 25 Javascript
javascript jquery对form元素的常见操作详解
Jun 12 Javascript
node.js缺少mysql模块运行报错的解决方法
Nov 13 Javascript
从零开始学习Node.js系列教程之SQLite3和MongoDB用法分析
Apr 13 Javascript
vue-cli项目中使用Mockjs详解
May 14 Javascript
如何使用jQuery操作Cookies方法解析
Sep 08 jQuery
vue动态绑定style样式
Apr 20 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 foreach循环使用详解与实例代码
2010/05/08 PHP
php文件服务实现虚拟挂载其他目录示例
2014/04/17 PHP
PHP中使用socket方式GET、POST数据实例
2015/04/02 PHP
yii2 数据库读写分离配置示例
2017/02/10 PHP
php从数据库中读取特定的行(实例)
2017/06/02 PHP
PHP实现的redis主从数据库状态检测功能示例
2017/07/20 PHP
JSQL 批量图片切换的实现代码
2010/05/05 Javascript
JS的replace方法详细介绍
2012/11/09 Javascript
js实现ifram取父窗口URL地址的方法
2015/02/09 Javascript
深入解析JavaScript的闭包机制
2015/10/20 Javascript
继续学习javascript闭包
2015/12/03 Javascript
详解JavaScript基于面向对象之创建对象(2)
2015/12/10 Javascript
Vue.JS入门教程之事件监听
2016/12/01 Javascript
原生js实现无缝轮播图效果
2017/01/11 Javascript
实例详解display:none与visible:hidden的区别
2017/03/30 Javascript
.net MVC+Bootstrap下使用localResizeIMG上传图片
2017/04/21 Javascript
vue实现密码显示隐藏切换功能
2018/02/23 Javascript
微信小程序实现滑动切换自定义页码的方法分析
2018/12/29 Javascript
生产制造追溯系统之再说条码打印
2019/06/03 Javascript
vue实现拖拽的简单案例 不超出可视区域
2019/07/25 Javascript
thinkjs微信中控之微信鉴权登陆的实现代码
2019/08/08 Javascript
javascript中的offsetWidth、clientWidth、innerWidth及相关属性方法
2020/05/14 Javascript
VUE 实现element upload上传图片到阿里云
2020/08/12 Javascript
python递归打印某个目录的内容(实例讲解)
2017/08/30 Python
python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例
2020/02/28 Python
戴尔美国官方折扣店:Dell Outlet
2018/02/13 全球购物
澳大利亚床上用品、浴巾和家居用品购物网站:Bambury
2020/04/16 全球购物
三项教育活动实施方案
2014/03/30 职场文书
环境日宣传活动总结
2014/07/09 职场文书
生活部的活动方案
2014/08/19 职场文书
汽车服务工程专业自荐信
2014/09/02 职场文书
地球上的星星观后感
2015/06/02 职场文书
2015年办税服务厅工作总结
2015/07/23 职场文书
《中彩那天》教学反思
2016/02/24 职场文书
一封真诚的自荐信帮你赢得机会
2019/05/07 职场文书
年终工作总结范文
2019/06/20 职场文书