簡體   English   中英

在ASP.NET中序列化為Json時如何更改屬性名稱

[英]How to change property names when serializing to Json in asp.Net

我有一個MVC Web API控制器,它公開了一個方法:

    [HttpPost]
    public JsonResult<CustomClass> Details(RequestClass request)
    {
        var encoding = Encoding.GetEncoding("iso-8859-1");
        var settings = new Newtonsoft.Json.JsonSerializerSettings();
        return Json(_InputService.CustomClassGet(request.Id), settings, encoding);
    }

CustomClass是一個非常復雜的類,其中包含不同級別的對象的多個級別。 這些類的對象使用依賴於Newtonsoft Json的映射器以某種方式內置在代碼的另一部分中。

我只是收到一個修改我的代碼的請求,以更改一些CustomClass屬性名(沿着整個樹)。 我的第一種方法是創建另一組類,所以我可以在中間使用一個轉換器來接收數據,而另一些用於公開數據,但是結構中有很多類,而且它們太復雜了,以至於會消耗很多時間。努力。 同樣,在從輸入類轉換為輸出類的過程中,將需要兩倍的內存來保存相同精確數據的2個副本。

我的第二種方法是使用JsonProperty(PropertyName ="X")更改生成的json BUT,因為輸入也依賴Newtonsoft Json,所以我完全破壞了輸入過程。

我的下一個方法是創建一個自定義序列化程序和用戶[JsonConverter(typeof(CustomCoverter))]屬性,但它更改了CustomClass在任何地方進行序列化的方式,我無法更改其余API的響應方式,僅更改某些特定方法即可。

因此,問題是... 有人能想到一種方法來更改我的CustomClass僅在某些方法中序列化的方式嗎?

這是最終的解決方案:

1)創建一個自定義屬性並裝飾需要在序列化的Json中更改其名稱的屬性:

[AttributeUsage(AttributeTargets.Property)]
class MyCustomJsonPropertyAttribute : Attribute
{
    public string PropertyName { get; protected set; }

    public MyCustomJsonPropertyAttribute(string propertyName)
    {
        PropertyName = propertyName;
    }
}

2)相應地裝飾屬性

class MyCustomClass
{
    [MyCustomJsonProperty("RenamedProperty")]
    public string OriginalNameProperty { get; set; }
}

3)使用反射實現自定義解析器,以使用MyCustomJsonPropertyAttribute裝飾的那些屬性重新映射屬性名稱

class MyCustomResolver : DefaultContractResolver
{               
    public MyCustomResolver()
    {            
    }

    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        JsonProperty prop = base.CreateProperty(member, memberSerialization);

        var attr = member.GetCustomAttribute(typeof(MyCustomJsonPropertyAttribute));
        if (attr!=null)
        {
            string jsonName = ((MyCustomJsonPropertyAttribute)attr).PropertyName;
            prop.PropertyName = jsonName;
        }
        return prop;
    }

}

4)像這樣在控制器中實現方法:

    [HttpPost]
    public JsonResult<MyCustomClass> Details(RequestClass request)
    {
        var encoding = Encoding.GetEncoding("iso-8859-1");
        var settings = new Newtonsoft.Json.JsonSerializerSettings()
        {
            ContractResolver = new MyCustomResolver()
        };
        return Json(_InputService.CustomClassGet(request.Id), settings, encoding);
    }

非常感謝dbc為我指明了方向。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM