6

Json.NET の学習を開始していますが、そのシリアライザーの使用に問題があります。Web.API サービスを使用した新しい MVC4 プロジェクトがあります。

public class PTE_TestsController : ApiController {

  PTE_TestsRepository _repository = new PTE_TestsRepository();

  // GET /api/PTE_Tests/5
  public HttpResponseMessage<string> Get(int id) {
    try {
       PTE_Test test = _repository.GetTest(id);
       return new HttpResponseMessage<string>(JsonConvert.SerializeObject(test));
    } catch {
       return new HttpResponseMessage<string>(HttpStatusCode.NotFound);
    }
  }
}

JsonConvert.SerializeObject() は期待どおりに機能し、文字列を返します。私の Web.API コントローラーは、HttpResponseMessage の一部としてそれを返します。最終結果を Fiddler で表示すると、JSON データではなく、JSON データが再度シリアル化されます (私はそう思います)。

"{\"ID\":1,\"Name\":\"Talar Tilt\",\"TagID\":1,\"PracticeID\":1,
   \"SpecificAreaID\":1,\"TypeID\":1,\"VideoID\":1,\"PicID\":1}"

Json.NETを直接使用できるように、デフォルトのシリアライザーをオフにする方法を知っている人はいますか? ところで、私はデフォルトのシリアライザーを使用していません。なぜなら、複雑なオブジェクトで動作させる方法がわからないからです (PTE_Test には最終的に List 型のメンバーが含まれます)。

または、複雑なオブジェクトでデフォルトのシリアライザーを使用する方法を誰かが説明できれば、私の問題も解決します。MSDN の説明は役に立ちませんでした。

4

3 に答える 3

5

Rick Strahl のブログで、動作するコードが掲載されています。

于 2012-04-20T19:40:53.603 に答える
2

他の人が指摘したように、フォーマッターを作成し、シリアライザーに置き換える必要がありDataContractSerializerますJSON.NET。ただし、特に JSON.NET を急いでいない場合は、次の beta/rc に JSON.NET のサポートが組み込まれるという噂があります。

ただし、概念的には、WebAPI の魔法の一部が欠けています。WebAPI を使用すると、オブジェクトをネイティブ状態 (または OData サポートが必要な場合は IQueryable) で返します。関数呼び出しが終了したら、フォーマッターが引き継ぎ、クライアントの要求に基づいて適切な形状に変換します。

したがって、元のコードではPTE_Test、JSON 文字列に変換してそれを返しました。その時点で、JSON フォーマッターが開始され、文字列がシリアル化されました。次のようにコードを変更しました。

  public class PTE_TestsController : ApiController {
    PTE_TestsRepository _repository = new PTE_TestsRepository();

    public HttpResponseMessage<PTE_Test> Get(int id)  {
        try {
            PTE_Test test = _repository.GetTest(id);
            return new HttpResponseMessage(test);
        } catch {
            return new HttpResponseMessage<string>(HttpStatusCode.NotFound);
        }
     }
   }

PTE_Testの代わりに関数がどのように返されるかに注目してくださいstring。リクエストが のリクエスト ヘッダーで受信されたと仮定するとAccept = application/json 、JSON フォーマッタが呼び出されます。リクエストのヘッダーが :Accept = text/xmlの場合、XML フォーマッタが呼び出されます。

このトピックに関する適切な記事がここにあります。あなたが視覚的な学習者である場合、Scott Gu がこのビデオでフィドラーを使用した例をいくつか示します。約 37 分から始まります。Pedro Reys は、ここでコンテンツ ネゴシエーションをもう少し深く掘り下げます。

于 2012-04-21T13:52:20.853 に答える
0

これを行う方法は、フォーマッターを使用することです。

チェックアウト: https://github.com/WebApiContrib/WebAPIContrib/tree/master/src/WebApiContrib.Formatting.JsonNet

Json.NET のサポートは、Web API の RC リリースで提供されます。

于 2012-04-20T18:42:43.957 に答える