2

RESTful な目的で MVC Web Api を使用しています。私のコントローラ メソッドは、シリアル化された 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 に変更し、シリアル化された Json オブジェクトを JsonValue.Parse() メソッドを使用して解析しました。サーバー側でコードをトレースすると、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 を追加し、System.Json.JsonValue の代わりに Newtonsoft.Json.Linq.JToken を使用することです。ここに私のメソッドの実装があります:

  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 に答える