【问题标题】:Json deserialize object array with dynamic property namesJson 使用动态属性名称反序列化对象数组
【发布时间】: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

标签: c# json serialization dynamic system.text.json


【解决方案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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2014-08-26
    • 2015-04-20
    • 1970-01-01
    相关资源
    最近更新 更多