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

来源:互联网 发布:手机淘宝怎么管理店铺 编辑:程序博客网 时间:2024/05/22 01:34
 

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

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