3

ASP.Net MVC4 アプリケーションで JsonResult を返すアクションがあります。Data プロパティを定義済みクラスの配列に設定しています。私の問題は、異なるプロパティ名でシリアル化したいということです。使用する属性に関係なく、オブジェクトは事前定義されたプロパティ名でシリアル化されます。私は結果なしで次のことを試しました:

[DataMember(Name = "iTotalRecords")]
[JsonProperty(PropertyName = "iTotalRecords")]
public int TotalRecords { get; set; }

「iTotalRecords」がばかげているように思えることはわかっていますが、このアクションは、「TotalRecords」ではなく「iTotalRecords」を期待する jQuery プラグインをサポートするためのものです。もちろん、コード ビハインドで意味のある名前を使用したいと考えています。

JsonResultの解析に使用されるシリアライザーは何ですか? 私にできることはありますか、または JsonResult をアクションの結果として返すことを再考する必要がありますか?

4

3 に答える 3

4

提案をありがとう。先に進み、Json.Net を使用する ActionResult を作成しました。

public class JsonNetActionResult : ActionResult
{
    public Object Data { get; private set; }

    public JsonNetActionResult(Object data)
    {
        this.Data = data;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        context.HttpContext.Response.ContentType = "application/json";
        context.HttpContext.Response.Write(JsonConvert.SerializeObject(Data));
    }
}

参考までに、Json.Net は [DataMember] と [JsonProperty] の両方を尊重しているようですが、[JsonProperty] は [DataMember] が異なる場合に優先されます。

于 2012-09-19T15:27:37.443 に答える
4

JsonResultの解析に使用されるシリアライザーは何ですか?

JavaScriptSerializer.

私にできることはありますか、または JsonResult をアクションの結果として返すことを再考する必要がありますか?

次の 2 つの可能性が考えられます。

  • ビューモデルを定義してから、ドメインモデルをビューモデルにマップします
  • Json.NET または DataContractJsonSerializer を使用し、シリアル化されたプロパティの名前を制御できるカスタム アクションの結果を記述します。次の質問はこれを示しています。
于 2012-09-19T15:02:42.617 に答える
1

こことSOでソリューションの一部を見つけました

public class JsonNetResult : ActionResult
    {
        public Encoding ContentEncoding { get; set; }
        public string ContentType { get; set; }
        public object Data { get; set; }

        public JsonSerializerSettings SerializerSettings { get; set; }
        public Formatting Formatting { get; set; }

        public JsonNetResult(object data, Formatting formatting)
            : this(data)
        {
            Formatting = formatting;
        }

        public JsonNetResult(object data):this()
        {
            Data = data;
        }

        public JsonNetResult()
        {
            Formatting = Formatting.None;
            SerializerSettings = new JsonSerializerSettings();
        }

        public override void ExecuteResult(ControllerContext context)
        {
            if (context == null)
                throw new ArgumentNullException("context");
            var response = context.HttpContext.Response;
            response.ContentType = !string.IsNullOrEmpty(ContentType)
              ? ContentType
              : "application/json";
            if (ContentEncoding != null)
                response.ContentEncoding = ContentEncoding;

            if (Data == null) return;

            var writer = new JsonTextWriter(response.Output) { Formatting = Formatting };
            var serializer = JsonSerializer.Create(SerializerSettings);
            serializer.Serialize(writer, Data);
            writer.Flush();
        }
    }

私のコントローラーで、私はそれを行うことができます

        return new JsonNetResult(result);

私のモデルでは、次のものを使用できるようになりました。

    [JsonProperty(PropertyName = "n")]
    public string Name { get; set; }

JsonPropertyAttributeここで、シリアル化するすべてのプロパティにを設定する必要があることに注意してください。

于 2014-03-28T11:16:35.220 に答える