javascriptserializer 类由异步通信层内部使用,用于序列化和反序列化在浏览器和 web 服务器之间传递的数据。说白了就是能够直接将一个c#对象传送到前台页面成为javascript对象。要添加system.web.extensions.dll的引用。该类位于system.web.script.serialization命名空间下。
一、属性
maxjsonlength 获取或设置 javascriptserializer 类接受的 json 字符串的最大长度。
recursionlimit 获取或设置用于约束要处理的对象级别的数目的限制。
二、方法
converttotypeb6f91b952978a53c7e34d3b42d692a81)>) 将给定对象转换为指定类型。
deserializeb6f91b952978a53c7e34d3b42d692a81)>) 将指定的 json 字符串转换为 t 类型的对象。
deserializeobject 将指定的 json 字符串转换为对象图。
registerconverters 使用 javascriptserializer 实例注册自定义转换器。
serialize 已重载。 将对象转换为 json 字符串。
给个示例,主要就是了解了一下serialize与deserialize两个方法,控制器代码:
public class homecontroller : controller
{
public actionresult index()
{
return view();
}
public actionresult getjson()
{
javascriptserializer jss = new javascriptserializer();
person p = new person(1, "张飞", 20);
string json = jss.serialize(p); //序列化成json
person p1 = jss.deserialize<person>(json); //再反序列化为person对象 注意此方法要求目标类有无参构造函数
//return json(json, "text/json"); //很好用,但是返回的终归是字符串,返回到前台要解析一下才能变成javascript对象。
return json(new { id = p1.id, name = p1.name, age = p1.age }, "text/json");//如果这样写,返回到javascript中是不用再解析的,直接就是javascript对象
}
}
public class person
{
public person()
{ }
public person(int id, string name, int age)
{
this.id = id;
this.name = name;
this.age = age;
}
public int id { get; set; }
public string name { get; set; }
public int age { get; set; }
}
前台html代码:
<html>
<head>
<title>javascriptserializer类测试</title>
<script src="/jquery.1.8.3.js" type="text/javascript"></script>
<script type="text/javascript">
$(function () {
$(":button").click(function () {
$.ajax({
url: "/home/getjson",
datatype: "json",
type: "post",
success: function (response) {
// var data = json.parse(response);
// $("#id").text(data.id);
// $("#name").text(data.name);
// $("#age").text(data.age);
$("#id").text(response.id);
$("#name").text(response.name);
$("#age").text(response.age);
}
})
})
})
</script>
</head>
<body>
<ul>
<li id="id"></li>
<li id="name"></li>
<li id="age"></li>
</ul>
<input type="button" value="确认" />
</body>
</html>
试下4个基础方法与属性
class program
{
static void main(string[] args)
{
// 方法
// registerconverters 使用 javascriptserializer 实例注册自定义转换器。
//属性
// recursionlimit 获取或设置用于约束要处理的对象级别的数目的限制。
javascriptserializer jss = new javascriptserializer();
console.writeline(jss.maxjsonlength); //默认接受最大的长度是 2097152 这个是接受json字符串的最大长度,超长会有什么后果呢?试下
jss.maxjsonlength = 1;
person p = new person(1,"关羽",21);
//string json = jss.serialize(p); //将对象序列化成json字符串 //此处报异常使用 json javascriptserializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxjsonlength 属性设置的值。
jss.maxjsonlength = 2097152;
//序列化
string json = jss.serialize(p);
console.writeline(json); //输出 {"id":1,"name":"关羽","age":21}`这就是json格式了
//反序列化deserialize
person p2 = jss.deserialize<person>("{\"id\":1,\"name\":\"关羽\",\"age\":21}");
console.writeline(p2.id + " " + p2.name + " " + p2.age); //输出 1 关羽 21
//deserialize的非泛型写法
person p3 = jss.deserialize("{\"id\":1,\"name\":\"关羽\",\"age\":21}",typeof(person)) as person; //注意这个方法返回的是object类,因此要强制转换成person类
console.writeline(p3.id + " " + p3.name + " " + p3.age); //同样输出 1 关羽 21
object obj = jss.deserializeobject("{\"id\":1,\"name\":\"关羽\",\"age\":21}"); //将json字符转换为object类型
//person p4 = obj as person; //此行代码转为的p4为null
person p4 = jss.converttotype<person>(obj); //尼玛,原来这个方法是这样用的,知道deserializeobject转换会为null所以另外写一个吗
console.writeline(p4.name); //输出关羽
//非泛型版本
person p5 = jss.converttotype(obj,typeof(person)) as person;
console.writeline(p5.name); //输出关羽
console.readkey();
}
}
实现自定义转换器
将指定的数据类型序列化为json。serialize方法是个递归方法,会递归地序列化对象的属性,因此在序列化一个复杂对象(比如datatable)时往往会出现“循环引用”的异常,这时候就需要针对复杂类型自定义一个转换器。下面是datatable的转换器,原理是把datatable转换成一个字典列表后再序列化:
所有自定义的转换器都要继承于javascriptconverter,并实现serialize、deserialize方法和supportedtypes属性,其中supportedtypes属性用于枚举此转换器支持的类型。
class program
{
static void main(string[] args)
{
datatable dt = new datatable();
dt.columns.add("id");
dt.columns.add("name");
dt.columns.add("age");
dt.rows.add(1, "关羽", 21);
dt.rows.add(2, "刘备", 22);
dt.rows.add(3, "张飞", 20);
javascriptserializer jss = new javascriptserializer();
//注册转换器的方法,用于复杂转换除了实现还需要注册到javascriptserializer
jss.registerconverters(new javascriptconverter[] { new datatableconverter() });
string strjson = jss.serialize(dt);
console.writeline(strjson);
//输出 {"rows":[{"id":"1","name":"关羽","age":"21"},{"id":"2","name":"刘备","age":"22"},{"id":"3","name":"张飞","age":"20"}]}
console.readkey();
}
}
/// <summary>
/// datatable json转换类
/// </summary>
public class datatableconverter : javascriptconverter
{
public override idictionary<string, object> serialize(object obj, javascriptserializer serializer)
{
datatable dt = obj as datatable;
dictionary<string, object> result = new dictionary<string, object>();
list<dictionary<string, object>> rows = new list<dictionary<string, object>>();
foreach (datarow dr in dt.rows)
{
dictionary<string, object> row = new dictionary<string, object>();
foreach (datacolumn dc in dt.columns)
{
row.add(dc.columnname, dr[dc.columnname]);
}
rows.add(row);
}
result["rows"] = rows;
return result;
}
public override object deserialize(idictionary<string, object> dictionary, type type, javascriptserializer serializer)
{
throw new notimplementedexception();
}
/// <summary>
/// 获取本转换器支持的类型
/// </summary>
public override ienumerable<type> supportedtypes
{
get { return new type[] { typeof(datatable) }; }
}
}
限制序列化的层次
class program
{
static void main(string[] args)
{
javascriptserializer jss = new javascriptserializer();
console.writeline(jss.recursionlimit); //默认的序列化层次是100
person p1 = new person(1, "刘备", 24);
p1.p = new person(2, "关羽", 23);
p1.p.p = new person(3, "张飞", 21);
string strjson = jss.serialize(p1);
console.writeline(strjson);
//输出 {"id":1,"name":"刘备","age":24,"p":{"id":2,"name":"关羽","age":23,"p":{"id":3,"name":"张飞","age":21,"p":null}}}
//现在将层次减少到1
jss.recursionlimit = 1;
string strjson2 = jss.serialize(p1);//这行代码是报异常的,显示已超出 recursionlimit。 这就是这个属性的作用
//最后再来说一个特性,比如如果我有某一个属性不希望它序列化,那么可以设置添加
console.readkey();
}
}
public class person
{
public person()
{ }
public person(int id, string name, int age)
{
this.id = id;
this.name = name;
this.age = age;
}
public int id { get; set; }
public string name { get; set; }
public int age { get; set; }
//里面嵌套一个person
public person p { get; set; }
}
[scriptignore]禁止某属性序列化
class program
{
static void main(string[] args)
{
javascriptserializer jss = new javascriptserializer();
person p = new person(1,"刘备",24);
console.writeline(jss.serialize(p));
file.writealltext(@"d:\123.txt", jss.serialize(p)); //输出 {"id":1,"age":24}
console.readkey();
}
}
public class person
{
public person()
{ }
public person(int id, string name, int age)
{
this.id = id;
this.name = name;
this.age = age;
}
public int id { get; set; }
[scriptignore]
public string name { get; set; }
public int age { get; set; }
}