c# JSON序列化使用值而不是属性名
Posted
技术标签:
【中文标题】c# JSON序列化使用值而不是属性名【英文标题】:c# JSON Serialization Use Value Instead of Property Name 【发布时间】:2015-03-20 18:13:48 【问题描述】:我正在开发一个 JSON 驱动的项目,我想为 SessionManager
对象提供一个动态的权限列表。虽然我可以使用一组键值对来获得权限,但我想知道是否可以删除属性名称,以便 key 是 Permission
值和 value 是IsAllowed
值。
public class SessionPermission
public string Permission get; set;
public bool IsAllowed get; set;
public class SessionManager
public string UserName get; set;
public string Password get; set;
public List<SessionPermission> Permissions get; set;
public void SetPermissions()
Permissions = new List<SessionPermission>
new SessionPermission Permission = "CreateUsers", IsAllowed = false,
new SessionPermission Permission = "EditUsers", IsAllowed = false,
new SessionPermission Permission = "EditBlog", IsAllowed = true
;
当我生成 JSON 时,它会输出一组权限:
"Permission": "CreateUsers",
"IsAllowed": false
,
我想知道如何覆盖序列化,以便它使用值而不是属性名称。
"CreateUsers": false
,
【问题讨论】:
你能把Permissions
改成Dictionary<string, bool>
吗?
你说得很好。
这样做可能会使序列化按您希望的方式工作
@DLeh 如果按键重复怎么办??
键不能在字典中重复。如果您尝试向字典中添加重复键,则会引发错误
【参考方案1】:
您可以使用以下自定义转换器:
public class SessionPermissionConverter : JsonConverter
public override object ReadJson(
JsonReader reader,
Type objectType,
object existingValue,
JsonSerializer serializer)
var obj = (JObject)JObject.ReadFrom(reader);
JProperty property = obj.Properties().FirstOrDefault();
return new SessionPermission
Permission = property.Name,
IsAllowed = property.Value.Value<bool>()
;
public override void WriteJson(
JsonWriter writer,
object value,
JsonSerializer serializer)
SessionPermission permission = (SessionPermission)value;
JObject obj = new JObject();
obj[permission.Permission] = permission.IsAllowed;
obj.WriteTo(writer);
public override bool CanConvert(Type t)
return typeof(SessionPermission).IsAssignableFrom(t);
public override bool CanRead
get return true;
用法:
var manager = new SessionManager();
manager.SetPermissions();
string json = JsonConvert.SerializeObject(manager, new SessionPermissionConverter());
示例 JSON:
"UserName": null,
"Password": null,
"Permissions": [
"CreateUsers": false
,
"EditUsers": false
,
"EditBlog": true
]
反之亦然。
示例: https://dotnetfiddle.net/mfbnuk
【讨论】:
太棒了。这正是我正在寻找的。感谢您的帮助。 @Pete:没问题,很乐意提供帮助。以上是关于c# JSON序列化使用值而不是属性名的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET MVC C# - 显示类属性名称而不是 JSON 中的属性名称
从 C# 程序中反序列化 JSON 时,我是不是需要使用 JavaScriptSerializer 以外的任何东西?
将 JSON 反序列化为 C# 类,其中 JSON 中的属性名称是动态的