Json 使用动态属性名称反序列化对象数组

Posted

技术标签:

【中文标题】Json 使用动态属性名称反序列化对象数组【英文标题】:Json deserialize object array with dynamic property names 【发布时间】:2021-12-10 10:09:15 【问题描述】:

我想在 c# 中使用 System.Text.Json 的 JsonSerializer.Deserialize 反序列化一个 json 对象。 json 看起来像这样:


   "id":10,
   "authorization_ids":[
      
   ],
   "karma_user_ids":[
      2
   ],
   "group_ids":
      "2":[
         "full"
      ],
      "4":[
         "read"
      ],
      "5":[
         "overview"
      ],
      "7":[
         "change",
         "overview"
      ],
      "10":[
         "create"
      ]
   

但属性group_ids 包含具有动态属性名称的对象,实际上对应于组的ID。


  2  : full
  4  : read
  5  : overview
  7  : change, overview
  10 : create

现在我想将 group_ids 反序列化为这样的对象:

public class GroupPermission

    public int GroupID  get; set; 
    public Permission Permission  get; set; 

    public GroupPermission()  


[Flags]
public enum Permission

    full = 1,
    read = 2,
    overview = 4,
    change = 8,
    create = 16

这可能吗?有人能指出正确的方向吗?

【问题讨论】:

您能否添加带有group_ids JSON 数据的完整 JSON?不清楚它的行为 @SachithWickramaarachchi 坦克,但你是什么意思? group_ids 的 json 是上面的第二个 json 代码块。但我添加了一条评论以使其更清楚。 块 1 和块 2 都不是有效的 JSON。请出示您的实际 JSON @Charlieface 对...对不起。更新了线程并添加了 json。 这能回答你的问题吗? json deserialization to C# with dynamic keys 在这种情况下,group_ids 应该反序列化为 Dictionary<int, List<string>>,字典键是 ID 【参考方案1】:

应该是这样的:

    public class RootObject
    
        [JsonPropertyName("id")]
        public int Id get;set;

        [JsonPropertyName("authorization_ids")]
        public List<int> AuthorizationIds get;set;
        
        [JsonPropertyName("karma_user_ids")]
        public List<int> KarmaUserIds get;set;

        [JsonPropertyName("group_ids")]
        public Dictionary<int, List<string>> GroupIds get;set;

        public RootObject()
        
            AuthorizationIds = new List<int>();
            KarmaUserIds = new List<int>();
            GroupIds = new Dictionary<int, List<string>>();
        
    

测试它:

public static void Main(string[] args)

    var json = File.ReadAllText("./file.json");
    var objs = JsonSerializer.Deserialize<RootObject>(json);

【讨论】:

以上是关于Json 使用动态属性名称反序列化对象数组的主要内容,如果未能解决你的问题,请参考以下文章

将 JSON 命名属性反序列化为 .Net 对象

json 从遗留属性名称反序列化

使用空白数组反序列化 JSON 对象

尝试反序列化 JSON 对象数组,其中对象具有数组作为属性。我可以将数组元素映射到类的特定属性吗?

使用变量名数组反序列化 JSON

序列化和反序列化过程中 JSON 属性的不同名称