簡體   English   中英

ASP.NET Web API正在使用下划線進行序列化

[英]ASP.NET Web API is serializing with underscore

我在ApiController中有以下簡單代碼:

public Version Get()
{
  var version = new System.Version(1, 1, 0, 0);
  return version;
}

結果如下:

json

{"_Major":1,"_Minor":1,"_Build":0,"_Revision":0}

XML文件

<Version xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/System">
  <_Build>0</_Build>
  <_Major>1</_Major>
  <_Minor>1</_Minor>
  <_Revision>0</_Revision>
</Version>

請注意,屬性前面帶有_ 查看Version類定義,所有這些屬性僅是Getters ,我懷疑這與為何序列化添加_ 我還嘗試在此處查找有關發生這種情況的信息,但所有信息都表明Read-only properties are serialized by default.

問題是,下划線使客戶端上的反序列化變得混亂,並導致版本為0.0.0.0

這是CLR類,我無法覆蓋它,因此如何刪除下划線,以便在客戶端上正確反序列化?

默認情況下,Web API序列化具有[Serializable]屬性(例如,Version)的類型的字段。 我不是它的忠實擁護者,這就是為什么Json.NET在默認情況下不這么做的原因,但這就是Web API人士想要的。

這將停止Web API使用JSON進行操作:

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.ContractResolver = new DefaultContractResolver();

在不更改整個序列化程序的情況下,您可以返回與CLR Version類映射的自定義對象。

版本號不應該經常更改。 我建議對此發表評論,以免您將來的自我重構。

如果您正在使用DataContractSerializer,請嘗試以下操作:

config.Formatters.XmlFormatter.SetSerializer(myType, new DataContractSerializer(myType, new DataContractSerializerSettings() { SerializeReadOnlyTypes = true });

否則,請確保JSON.NET是最新的。 序列化只讀屬性應該沒有任何困難。

我已經使用JSON.NET進行了測試,它似乎拾取了像您的輸出一樣命名的字段,並且完全避免使用公共屬性。

作為臨時解決方案,我將復制對象並返回它,以便更好地控制序列化。

最新的JSON.NET和MVC二進制文件提供了相同的結果。 如果設置控制台應用程序並使用JSON.NET進行序列化,則會獲得預期的版本(無下划線)。 您可以嘗試使用媒體類型格式化程序和序列化程序來煩躁,但老實說,我只是創建一個值對象來包裝Version並完成它。

我還嘗試創建一個具有只讀屬性的值對象,並且還創建了沒有setter的字段支持的屬性。 全部序列化而沒有下划線。 必須是Version類本身中的東西。

抱歉,這個問題我不能幫您。 在不同情況下,我也有類似的情況。 我只能建議您使用

  1. String.Replace('_',string.Empty());
  2. 反序列化它。

希望對您有所幫助。

如果您想快速解決問題,這里有一個

public object  Get()
    {
        var version = new System.Version(1, 2, 3, 4);
        return new
        {
            version.Build,
            version.Major,
            version.Minor,
            version.Revision
        };
    }

暫無
暫無

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

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