[DataMember(Name = “Test”)]と同等のJsonResult

asp.net asp.net-mvc-2 json jsonresult
[DataMember(Name = “Test”)]と同等のJsonResult

私はこれを行う方法があります:

public JsonResult Layar(string countryCode, string timestamp, string userId,
                        string developerId, string layarName, double radius,
                        double lat, double lon, double accuracy)
{
    LayarModel model = new LayarModel(lat, lon, radius);

    return Json(model, JsonRequestBehavior.AllowGet);
}

このオブジェクトを返します:

public class LayarModel
{
    private List _hotSpots = new List();
    public List HotSpots { get { return _hotSpots; } set { _hotSpots = value; } }
    public string Name { get; set; }
    public int ErrorCode { get; set; }
    public string ErrorString { get; set; }
}

JSONが欲しい

{"hotspots": [{
    "distance": 100,
    "attribution": "The Location of the Layar Office",
    "title": "The Layar Office",
    "lon": 4884339,
    "imageURL": http:\/\/custom.layar.nl\/layarimage.jpeg,
    "line4": "1019DW Amsterdam",
    "line3": "distance:%distance%",
    "line2": "Rietlandpark 301",
    "actions": [],
    "lat": 52374544,
    "type": 0,
    "id": "test_1"}],
 "layer": "snowy4",
 "errorString": "ok",
 "morePages": false,
 "errorCode": 0,
 "nextPageKey": null
}

返されるクラスのように、すべて大文字で出力されます(「hotspots」ではなく「HotSpots」)。

DataContractとDataMembers(Name = “Test”)を試しましたが、うまくいきません。 助言がありますか?

  4  0


ベストアンサー

JsonResult()は内部的にシリアル化のためにJavaScriptSerializerを使用し、属性を使用したシリアル化されたプロパティ名の定義をサポートしていないようです。

DataContractJsonSerializerはこれをサポートしています。

役に立つかもしれないいくつかのリンク:

1


json.NETをインストールすることもお勧めしますが、残りはずっと簡単です。 以下は、より良い再利用を提供するために現在のアプリケーションで使用している拡張メソッドで、自由にそれをあなたのニーズに適応させますが、すぐに必要なことをするはずです。

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()
    {
        SerializerSettings = new JsonSerializerSettings
            {
                //http://odetocode.com/blogs/scott/archive/2013/03/25/asp-net-webapi-tip-3-camelcasing-json.aspx
                #if DEBUG
                Formatting = Formatting.Indented, //Makes the outputted Json easier reading by a human, only needed in debug
                #endif
                ContractResolver = new CamelCasePropertyNamesContractResolver() //Makes the default for properties outputted by Json to use camelCaps
            };
    }

    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
            throw new ArgumentNullException("context");

        HttpResponseBase response = context.HttpContext.Response;

        response.ContentType = !string.IsNullOrEmpty(ContentType)
                                    ? ContentType
                                    : "application/json";

        if (ContentEncoding != null)
            response.ContentEncoding = ContentEncoding;

        if (Data != null)
        {
            JsonTextWriter writer = new JsonTextWriter(response.Output) {Formatting = Formatting};

            JsonSerializer serializer = JsonSerializer.Create(SerializerSettings);
            serializer.Serialize(writer, Data);

            writer.Flush();
        }
    }
}

public static class JsonNetExtenionMethods
{
    public static ActionResult JsonNet(this Controller controller, object data)
    {
        return new JsonNetResult() {Data = data};
    }

    public static ActionResult JsonNet(this Controller controller, object data, string contentType)
    {
        return new JsonNetResult() { Data = data, ContentType = contentType };
    }

    public static ActionResult JsonNet(this Controller controller, object data, Formatting formatting)
    {
        return new JsonNetResult() {Data = data, Formatting = formatting};
    }
}

これを使う例です。

public JsonNetResult Layar(string countryCode, string timestamp, string userId,
                        string developerId, string layarName, double radius,
                        double lat, double lon, double accuracy)
{
    LayarModel model = new LayarModel(lat, lon, radius);

    return this.JsonNet(model);
}

特にあなたの問題を解決することに注意する部分は、「JsonSerializerSettings」の「ContractResolver」が「new CamelCasePropertyNamesContractResolver()」を使用するように設定されている場合です。

これにより、カスタムの命名を再度設定する必要がなくなります。

0


タイトルとURLをコピーしました