【问题标题】:How to serialize enums to different property name using json.net如何使用 json.net 将枚举序列化为不同的属性名称
【发布时间】:2014-12-11 01:35:31
【问题描述】:

我有以下枚举

public enum PermissionType
{
  [JsonProperty(PropertyName = "can_fly")]
  PermissionToFly,
  [JsonProperty(PropertyName = "can_swim")]
  PermissionToSwim
};

以及具有此属性的类

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

我想将枚举列表序列化为字符串列表,并且该序列化列表使用PropertyName 中指定的字符串(例如“can_swim”)而不是属性的实际名称“PermissionToSwim”。但是,每当我调用 JsonConvert.SerializeObject 时,我都会得到 ​​p>

"permission_keynames":["PermissionToFly","PermissionToSwim"]

而不是我想要的

"permission_keynames":["can_fly","can_swim"]

我想保留短语“PermissionToSwim”以在我的代码中使用,序列化为另一个单词。知道如何实现这一目标吗?我的直觉说注释是罪魁祸首,但我一直找不到正确的。

【问题讨论】:

  • 如果将来有人遇到相反的问题(反序列化为具有不同命名值的枚举),请查看this question

标签: c# serialization enums json.net


【解决方案1】:

Looks like 你可以使用EnumMember attribute(在 System.Runtime.Serialization 中找到)来完成这项工作。

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

    [EnumMember(Value = "can_swim")]
    PermissionToSwim
}

如果您使用这些属性,您也不需要在列表中的JsonProperty 属性中设置ItemConverterType

【讨论】:

  • 完美,谢谢!实际上我之前看到过这个,但认为它不适用于 json.net,因为它是一个 System.Runtime.Serialization 注释。我几乎不知道...
  • 这对我有用,除了关于您的最后一条评论,我仍然需要使用 StringEnumConverter——否则,它会返回反序列化为整数。
  • 我同意@Gyromite。这就是我必须这样做才能使其工作:1)序列化:var js = JsonConvert.SerializeObject(PermissionType.PermissionToFly, new StringEnumConverter()); 2)反序列化:var permissionType = JsonConvert.DeserializeObject&lt;PermissionType&gt;(js, new StringEnumConverter());
  • 请注意,这不是 Json.NET 特有的,还可能影响其他序列化枚举的方法,例如 XML 序列化。
猜你喜欢
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
  • 2012-02-06
相关资源
最近更新 更多