簡體   English   中英

如何防止Json.NET將枚舉轉換為字符串?

[英]How to prevent Json.NET converting enum to string?

以下課程

public class RequestSections : RequestBase
{
    public RequestSections(Command c, Dictionary<SectionIdentifier, BigInteger> v) : base(c)
    {
        VERSIONS = v;
    }

    public Dictionary<SectionIdentifier, BigInteger> VERSIONS { get; set; }
}

使用JSON.NET序列化為JSON並生成以下JSON輸出:

{
  "VERSIONS": {
    "Photos": 901,
    "Music": 902
  },
  "CMD": 43
}

問題是SectionIdentifierenum但JSON.NET將它們轉換為字符串。

public enum SectionIdentifier
{
    Photos = 1000,
    Music
}

如何防止JSON.NET將整數enum值轉換為字符串? 我想只看到他們的整數表示。

順便說一下,駐留在RequestBase類中的CMD也是enum類型,但幸運的是它沒有轉換為字符串。

JSON規范說對象中的屬性名稱(鍵)必須是字符串。 如果你有一個使用枚舉值作為鍵的字典,Json.Net只是在這些值上調用Convert.ToString()來獲取JSON屬性名。 (這可以在源代碼中的GetPropertyName()方法中看到,該方法由SerializeDictionary()調用。)

可以覆蓋此默認行為,以便Json.Net將數字枚舉字典鍵寫入JSON(當然,仍然作為字符串,與規范保持一致)。 這可以使用自定義ContractResolver或自定義JsonConverter 在這種特殊情況下,解析器方法可能會更簡單,所以我將在這里展示。 以下是您需要的代碼:

class CustomResolver : DefaultContractResolver
{
    protected override JsonDictionaryContract CreateDictionaryContract(Type objectType)
    {
        var contract = base.CreateDictionaryContract(objectType);

        var keyType = contract.DictionaryKeyType;
        if (keyType.BaseType == typeof(Enum))
        {
            contract.PropertyNameResolver = 
                     propName => ((int)Enum.Parse(keyType, propName)).ToString();
        }

        return contract;
    }
}

要序列化,請通過以下設置將自定義解析程序的實例傳遞給序列化程序:

JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver = new CustomResolver();

string json = JsonConvert.SerializeObject(foo, settings);

這是一個人為的演示,表明它的工作原理。 您可以注釋掉設置解析器的行以切換行為。

class Program
{
    static void Main(string[] args)
    {
        var dict = new Dictionary<Color, string>
        {
            { Color.Red, "#FF0000" },
            { Color.Green, "#00FF00" },
            { Color.Blue, "#0000FF" },
            { Color.White, "#FFFFFF" }
        };

        JsonSerializerSettings settings = new JsonSerializerSettings();
        settings.ContractResolver = new CustomResolver();
        settings.Formatting = Formatting.Indented;

        string json = JsonConvert.SerializeObject(dict, settings);
        Console.WriteLine(json);
    }

    enum Color { Red = 1, Green = 2, Blue = 3, White = 4 }
}

輸出:

{
  "1": "#FF0000",
  "2": "#00FF00",
  "3": "#0000FF",
  "4": "#FFFFFF"
}

暫無
暫無

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

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