c# JSON序列化使用值而不是属性名

Posted

技术标签:

【中文标题】c# JSON序列化使用值而不是属性名【英文标题】:c# JSON Serialization Use Value Instead of Property Name 【发布时间】:2015-03-20 18:13:48 【问题描述】:

我正在开发一个 JSON 驱动的项目,我想为 SessionManager 对象提供一个动态的权限列表。虽然我可以使用一组键值对来获得权限,但我想知道是否可以删除属性名称,以便 keyPermission 值和 valueIsAllowed 值。

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&lt;string, bool&gt;吗? 你说得很好。 这样做可能会使序列化按您希望的方式工作 @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 中的属性名称是动态的

如何反序列化 Json 并绑定到变量/属性 c#

C# Newtonsoft.Json JObject移除属性,在序列化时忽略

反序列化 json,其中属性与内置数据类型同名,在 C# 中