2012-07-31 40 views
2

我使用MVC web Api進行RESTful目的。我的控制器方法以字符串格式返回序列化的Json對象。我有一些像這樣的簡單的方法:由MVC Web API返回的JsonValue在客戶端是空的

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

我打電話GET,PUT,DELETE和郵政QUnit的測試方法是這樣,它工作正常:

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": [] 
} 

我明白任何想法。

+0

做你的VAR文件夾1 =文件夾{ID =忘記「新」」 1「,IsShared = true,Name = folder.Name}; ?像var folder1 =新文件夾{Id =「1」,IsShared = true,Name = folder.Name}; – 2012-07-31 02:04:40

+0

我編輯我的帖子。 – 2012-07-31 02:17:14

回答

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)); 
     }