zl程序教程

您现在的位置是:首页 >  其他

当前栏目

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

转换客户端JSONJSON 格式 服务器端
2023-06-13 09:14:12 时间
这里我们会从javascript的语法引申出json,并在此基础上引出如何在ajax应用程序上使用JSON。
在javascript大家知道有个Arrays:数组。它的格式如下:
复制代码代码如下:

varBeatles=[“Paul”,”John”,”George”,”Ringo”];

上面的实例一个Array的形式和下面的等价:
复制代码代码如下:

varBeatles=newArray[“Paul”,”John”,”George”,”Ringo”];

再有一个就是Objects,对象的创建方式如下:
复制代码代码如下:
varBeatles={“Country”:”England”,”YearFormed”:1959,”Style”:”Rock"n"Roll”}

上面这个创建方式等同于如下的创建方式:
复制代码代码如下:
varBeatles=newObject();
Beatles.Country=“England”;
Beatles.YearFormad=1959;
Beatles.Style=“Rock"n"Roll”;

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

同样也可以在Array中包含Objects:
复制代码代码如下:
varRockbands=[
{
“Name”:”BeatLes”,
“County”:“England”,
“YearFormed”:1959,
“Style”:“Rock"n"Roll”,
“Members”:[“Paul”,”John”,”George”,”Ringo”]
},
{
“Name”““RollingStones”,
“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的代码:
复制代码代码如下:
publicstringSerialize(objectvalue)
{
Typetype=value.GetType();

Newtonsoft.Json.JsonSerializerjson=newNewtonsoft.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(newDataRowConverter());
elseif(type==typeof(DataTable))
json.Converters.Add(newDataTableConverter());
elseif(type==typeof(DataSet))
json.Converters.Add(newDataSetConverter());

StringWritersw=newStringWriter();
Newtonsoft.Json.JsonTextWriterwriter=newJsonTextWriter(sw);
if(this.FormatJsonOutput)
writer.Formatting=Formatting.Indented;
else
writer.Formatting=Formatting.None;

writer.QuoteChar=""";
json.Serialize(writer,value);

stringoutput=sw.ToString();
writer.Close();
sw.Close();

returnoutput;
}

publicobjectDeserialize(stringjsonText,TypevalueType)
{
Newtonsoft.Json.JsonSerializerjson=newNewtonsoft.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;

StringReadersr=newStringReader(jsonText);
Newtonsoft.Json.JsonTextReaderreader=newJsonTextReader(sr);
objectresult=json.Deserialize(reader,valueType);
reader.Close();

returnresult;
}

在NET.JSON的基础上使用JavascriptSeriazible来转换:
复制代码代码如下:
internalclassWebExtensionsJavaScriptSerializer:JSONSerializerBase,IJSONSerializer
{
publicWebExtensionsJavaScriptSerializer(JSONSerializerserializer):base(serializer)
{}

publicstringSerialize(objectvalue)
{
JavaScriptSerializerser=newJavaScriptSerializer();

List<JavaScriptConverter>converters=newList<JavaScriptConverter>();

if(value!=null)
{
Typetype=value.GetType();
if(type==typeof(DataTable)||type==typeof(DataRow)||type==typeof(DataSet))
{
converters.Add(newWebExtensionsDataRowConverter());
converters.Add(newWebExtensionsDataTableConverter());
converters.Add(newWebExtensionsDataSetConverter());
}

if(converters.Count>0)
ser.RegisterConverters(converters);
}

return=ser.Serialize(value);
}
publicobjectDeserialize(stringjsonText,TypevalueType)
{
//***HavetouseReflectionwitha"dynamic"nonconstanttypeinstance
JavaScriptSerializerser=newJavaScriptSerializer();


objectresult=ser.GetType()
.GetMethod("Deserialize")
.MakeGenericMethod(valueType)
.Invoke(ser,newobject[1]{jsonText});
returnresult;
}
}



internalclassWebExtensionsDataTableConverter:JavaScriptConverter
{
publicoverrideIEnumerable<Type>SupportedTypes
{
get{returnnewType[]{typeof(DataTable)};}
}

publicoverrideobjectDeserialize(IDictionary<string,object>dictionary,Typetype,
JavaScriptSerializerserializer)
{
thrownewNotImplementedException();
}

下篇介绍如何在ASP.NET的环境下使用JSON和DataTable等的转换,还有介绍使用JQuery的AJAX调用WebServices的生成JSON、相当值得期待。^_^