.net mvc3.0 中接收 json 数据,并转换为自定义的 C# 对象
软件环境:jquery + .net mvc3.0 + c#
功能说明:
1.在 javascript 中实例化一个 json 对象,并赋值
2.将 json 对象传递到 mvc3.0 项目 Controller 的 Action 中
3.得到 json 字符串,序列化(转换)为C# 定义的对象
需要注意:
1.如果使用 jQuery.post(url, [data], [callback], [type]),将
json 对象传递到服务器,将无法转换。
因为 jquery 在 post 前将 json 对象进行了序列化。
1.1)声明的 json 对象
var test =
{
IsDownLoad: false,
SavePath: "c:\aaa",
FileName: "test.txt"
};
1.2)被 jquery 序列化后的 json 对象
IsDownLoad=false&SavePath=c%3Aaaa&FileName=test.txt
由于 C# 转换需要json 对象的字符串表示形式,即1.1所描述的格式(而不是被jquery序列化过的字符串)
所以,在 post 之前需要得到 json 对象的字符串表示形式,用下面的函数就可以了(找了很久啊@!!!)
var jsonStr = JSON.stringify(test);
知道这些看下面的代码也就方便了!!!
----------------服务器端代码部分--------------------
1.首先我们定义 C# 中的类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Fms.DataObject
{
/// <summary>
/// 压缩文件内容
/// </summary>
public class ArchiveInfo
{
public ArchiveInfo()
{
FilePathList = new List<FilePath>();
}
public bool IsDownLoad { set; get; }
public string FileName { set; get; }
public string SavePath { set; get; }
public List<FilePath> FilePathList { set; get; }
}
/// <summary>
/// 文件路径
/// </summary>
public class FilePath
{
public string Path { set; get; }
}
}
2.写个两个扩展方法,用于将 json 字符转换为对象,和将对象转换为 json 字符
这两个方法只要写在和下面 Controller 同一个命名空间下就能以被调用了,
扩展方法不会用的自己去 msdn 中学吧!
/// <summary>
/// 生成Json格式
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <returns></returns>
public static string ToJsonStr<T>(T obj)
{
DataContractJsonSerializer json = new DataContractJsonSerializer(obj.GetType());
using (MemoryStream stream = new MemoryStream())
{
json.WriteObject(stream, obj);
string szJson = Encoding.UTF8.GetString(stream.ToArray());
return szJson;
}
}
/// <summary>
/// 将JSON 字符转换为对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="str"></param>
/// <returns></returns>
public static T ToJsonObject<T>(this string str)
{
T obj = Activator.CreateInstance<T>();
using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(str)))
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
return (T)serializer.ReadObject(ms);
}
}
3.定义 mvc 中的 Controller
namespace Fms.Controllers
{
public class ExplorerController : Controller
{
/// <summary>
/// 压缩文件
/// </summary>
/// <returns></returns>
[HttpPost]
public string Archive(FormCollection c)
{
ArchiveInfo info = c["jsonStr"].ToJsonObject<DataObject.ArchiveInfo>();
return "ok";
}
}
}
----------------客户端代码部分--------------------
function Archive()
{
var rows = $('#tabDirContent').datagrid('getSelections');
if (rows.length == 0)
{
alert("未选中任何文件!");
return;
}
var archive =
{
IsDownLoad: false,
SavePath: "",
FileName: "",
FilePathList: []
};
var spath = $("#txtDirPath").val();
archive.FileName = $("#txtFileName").val();
archive.IsDownLoad = $("#chbDownLoad").attr("checked");
if (archive.FileName == "")
{
alert("请输入压缩文件名称!");
return;
}
if (spath == "")
archive.SavePath = m_currentPath;
else
archive.SavePath = spath;
$.each(rows, function (i, row)
{
var pth = { "Path": row.FullPath };
archive.FilePathList.push(pth);
});
/*******************
以上的逻辑大家不需要知道是做什么用的,
我偷点儿懒哈!
大家只需要知道 archive 东西是个标准的 json 对象就行了!!
*******************/
//alert($(archive).serializeArray());
//将 json 对象转换为 json字符串表示形式,暂时用着没问题!
var jsonStr = JSON.stringify(archive);
//使用 jquery 的 psot 方法提交请求
//需要注意的是 { "jsonStr": jsonStr } 段儿代码~!~!
$.post("archive.aspx"
, { "jsonStr": jsonStr }
, function (data)
{
alert("data loaded: " + data);
});
}
----------------------------------------------------------------
思路清楚了还是比较较简单的吧!祝大家编码愉快!