.net mvc3.0 中接收 json 数据,并转换为自定义的 C# 对象

  • Post author:
  • Post category:其他


软件环境: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);

});

}

—————————————————————-

思路清楚了还是比较较简单的吧!祝大家编码愉快!