1

したがって、私は MVC4 を使用するのが初めてで、バックエンドでのオブジェクトのシリアル化はかなり「魔法のよう」に思えるので、これを間違った方法で行っている場合はお知らせください。

ただし、私の目標は、単純な REST API を構築し、JSON を返すことです。System.Json を使用して JsonObject を返すだけだと考えました。この質問のためにこれを単純化しましたが、実際の問題ではオブジェクトははるかに複雑です。

これが私のコントローラーです....

....

 public class ActionsController : ApiController
    {
        // GET api/actions
        public JsonObject Get()
        {
            JsonObject testObjet = new JsonObject();
            testObjet.Add("Name", "Test name");
            testObjet.Add("Description", "Test Description");

            return testObjet;

        }
....

私は見ることを期待します:

{"Name":"Test name","Description":"Test Description"}

代わりに、次のように表示されます。

{"Name":[],"Description":[]}

JsonObject の文字列を返すと、実際にはより良い結果が得られるようです。または、オブジェクト自体を返すだけでも、列挙型があり、数値ではなく名前を返したいと考えています。これが、カスタマイズのために JsonObject につながった理由です。 .

なぜそれが値を落としているのか誰かが知っていますか?

編集:だから、以下のダンのコメントのために、XMLシリアライザーがJSONオブジェクトで何を吐き出すかを見るために笑いを試みたところ、以下の例外が発生しました...

「タイプ 'System.Json.JsonPrimitive' データ コントラクト名 'JsonPrimitive: http://schemas.datacontract.org/2004/07/System.Json ' は想定されていません。」

したがって、System.Json.JsonObject オブジェクトは予期しない型を使用しているため、シリアル化できないようです。

それは衝撃的です。誰にも回避策がありますか?そうでない場合は、値の代わりにシリアル化するときに列挙型の名前を表示する方法を見つけるために出発します。

4

3 に答える 3

1

答えはどうやら…できません!

JsonPrimitive 型は、オブジェクトをシリアル化するためにサポートされていないようです。Obi と Dan が提供した以下の回答は、XML シリアライザーが実際に例外をスローするのに対し、JSON シリアライザーは単純にそれを食べて、上に表示されている空の配列を出力することを発見するのに役立ちました。

ここにはいくつでも正解があります。

  1. 独自のカスタム シリアライザーを作成する
  2. JSON を文字列として出力する
  3. カスタム オブジェクトを返し、Enum 値などを回避する

他にもいると思います。

ただし、上記の結果が得られるため、 System.Json を ApiController の戻り値として使用しようとしないでください。

于 2013-04-08T21:54:57.653 に答える
0

代わりにこれを行うことをお勧めします

// GET api/actions public object Get() { //特定の型を返したい場合は、厳密に型指定されたオブジェクトを新規作成し、 //それに応じて Action の戻り値の型を変更します var testObjet = new (){ Name= "テスト名", Description= "テストの説明" }; testObjet を返します。}

ダンが同様の回答を以下に投稿したので、他の問題に対処してみましょう。列挙型をシリアル化するには、列挙型の文字列値を返すパブリック文字列プロパティで非表示にすることをお勧めします。

public class DataObject{
    public MyEnum SomeEnumValue;
    public string EnumValue{
       get {
          //..return SomeEnumValue string value
        }
    }
}

次に、必要に応じて適切にシリアル化する必要がある EnumValue から値を読み取ることができます。

于 2013-04-08T18:47:49.090 に答える