如何使用json.net将枚举序列化为不同的属性名称

pgh*_*er4 18 c# enums serialization json.net

我有以下枚举

public enum PermissionType
{
  [JsonProperty(PropertyName = "can_fly")]
  PermissionToFly,
  [JsonProperty(PropertyName = "can_swim")]
  PermissionToSwim
};
Run Code Online (Sandbox Code Playgroud)

以及具有此属性的类

[JsonProperty(PropertyName = "permissions", ItemConverterType = typeof(StringEnumConverter))]
public IList<PermissionType> PermissionKeynames { get; set; }`
Run Code Online (Sandbox Code Playgroud)

我想将枚举列表序列化为字符串列表,并且序列化列表使用指定的字符串PropertyName(例如"can_swim")而不是属性的实际名称"PermissionToSwim".但是,每当我调用JsonConvert.SerializeObject时,我最终都会

"permission_keynames":["PermissionToFly","PermissionToSwim"]
Run Code Online (Sandbox Code Playgroud)

而不是我想要的

"permission_keynames":["can_fly","can_swim"]
Run Code Online (Sandbox Code Playgroud)

我希望在我的代码中保留短语"PermissionToSwim",序列化为另一个单词.知道我怎么能做到这一点?我的直觉说,注释是罪魁祸首,但我找不到正确的注释.

And*_*ker 30

看起来你可以使用EnumMember属性(在System.Runtime.Serialization中找到)来完成这项工作.

public enum PermissionType
{
    [EnumMember(Value = "can_fly")]
    PermissionToFly,

    [EnumMember(Value = "can_swim")]
    PermissionToSwim
}
Run Code Online (Sandbox Code Playgroud)

如果使用这些属性,则还不需要在列表ItemConverterType中的JsonProperty属性中进行设置.

  • 这对我有用,除了关于你的最后一条评论,我仍然需要使用StringEnumConverter - 否则,它会重新反序列化为整数. (3认同)
  • 我同意@Gyromite.这就是我必须做的工作:1)序列化:`var js = JsonConvert.SerializeObject(PermissionType.PermissionToFly,new StringEnumConverter());`2)反序列化:`var permissionType = JsonConvert.DeserializeObject <PermissionType >(js,new StringEnumConverter());` (2认同)