2

我将 MVC Web Api 用于 RESTful 目的。我的控制器方法以字符串格式返回序列化的 Json 对象。我有一些像这样的简单方法:

public string Put(Folder folder)
{
   var folder1 = new Folder{Id="1", IsShared=true,Name= folder.Name};
   var jsSerializer = new JavaScriptSerializer();
   return jsSerializer.Serialize(folder1);
}

我像这样在 QUnit 测试中调用 Get、Put、Delete 和 Post 方法,它工作正常:

ajax: {
        getData: function (url, data) {
            return processRequest(url, data, "GET");
        },

        postData: function (url, data) {
            return processRequest(url, JSON.stringify(data),"POST");
        },

        updateData: function (url, data) {
            return processRequest(url, JSON.stringify(data),"UPDATE");
        },

        deleteData: function (url, data) {
            return processRequest(url, JSON.stringify(data),"DELETE");
        },

        processRequest: function (url, data, type) {
            return $.ajax({
                type: type,
                dataType: "json",
                contentType: "application/json;charset=utf-8",
                url: url,
                data: data,
                processData: true
            });
        }
    },

我需要将返回值从字符串更改为实际的 Json 对象,因为我的客户不再需要序列化 ​​Json。他们需要实际的 Json 对象。所以我将方法返回类型更改为 JsonValue 并使用 JsonValue.Parse() 方法解析序列化的 Json 对象。当我在服务器端跟踪我的代码时,JsonValue 对象在其属性中具有正确的值并且看起来不错,但在客户端返回的 JsonValue 具有空属性。这里是改变方法:

public JsonValue Put(Folder folder)
{
   var folder1 = new Folder{Id="1", IsShared=true,Name= folder.Name};
   var jsSerializer = new JavaScriptSerializer();
   return JsonValue.Parse(jsSerializer.Serialize(folder1));
}

这是测试结果:

Expected:   
{
  "Id": "1",
  "IsShared": true,
  "Name": "abc"
}

Actual:
{
  "Id": [],
  "IsShared": [],
  "Name": []
}

我很感激任何想法。

4

1 回答 1

1

我所做的修复是将 Newtonsoft.Json.dll 添加到我的项目中并使用 Newtonsoft.Json.Linq.JToken 而不是使用 System.Json.JsonValue。这是我的方法实现:

  public Newtonsoft.Json.Linq.JToken Put(Folder folder)
  {
     var folder1 = new Folder{Id="1", IsShared=true,Name = folder.Name};
     var jsSerializer = new JavaScriptSerializer();
     return Newtonsoft.Json.Linq.JObject.Parse(jsSerializer.Serialize(folder1));
  }

如果你有一个 JSON 数组,你需要像这样解析:

public Newtonsoft.Json.Linq.JToken Put(IList<Folder> folders)
      {
         var folder1 = new Folder{Id="1", IsShared=true,Name = folder.Name};
         var jsSerializer = new JavaScriptSerializer();
         return Newtonsoft.Json.Linq.JArray.Parse(jsSerializer.Serialize(folders));
      }
于 2012-10-08T00:55:18.690 回答