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 使用动态属性名称反序列化对象数组的主要内容,如果未能解决你的问题,请参考以下文章