如何用Newtonsoft.Json序列化带标识符的用户对象以优化查找效率?
如何用Newtonsoft.Json序列化带用户名标识符的用户对象?
嘿,这个需求太实用了——用用户名直接作为键索引用户,确实比遍历数组高效太多。咱们直接调整代码结构,适配你想要的JSON格式:
核心思路
你现在用的List<User>序列化后是数组结构,而你需要的是键值对对象,正好对应C#里的Dictionary<string, User>(键是用户名,值是用户信息对象)。Newtonsoft.Json会自动把字典序列化为你想要的{ "用户名": { ... } }格式。
具体修改步骤
1. 替换集合类型
把原来的List<User>换成Dictionary<string, User>,比如:
// 初始化字典(如果是从现有JSON加载,反序列化也要用这个类型) Dictionary<string, User> usersDict = new Dictionary<string, User>();
2. 调整添加用户的逻辑
原来的判断和添加逻辑改成检查字典中是否存在该用户名键,不存在则添加键值对:
if (!usersDict.ContainsKey(inviterUsername)) { User theuser = new User { // 注意:这里不需要再赋值name属性了,因为字典的键就是用户名 inviteID = inviteID, inviteCount = inviteCount.ToString(), invited = invited }; usersDict.Add(inviterUsername, theuser); }
如果你的User类里还保留着name属性,建议给它加上[JsonIgnore]特性,避免序列化时重复输出:
public class User { [JsonIgnore] // 标记后序列化时会忽略这个属性 public string name { get; set; } public string inviteID { get; set; } public string inviteCount { get; set; } public string invited { get; set; } }
3. 序列化代码(几乎不用改)
直接序列化字典即可,Newtonsoft.Json会自动处理成你要的结构:
string updatedjson = JsonConvert.SerializeObject(usersDict, Formatting.Indented); File.WriteAllText("InviteData/data.json", updatedjson);
序列化后的JSON效果
{ "examplename": { "inviteID": "", "inviteCount": "", "invited": "" }, "examplename2": { "inviteID": "", "inviteCount": "", "invited": "" } }
补充:反序列化的写法
如果要从JSON文件加载数据,同样用Dictionary<string, User>反序列化:
Dictionary<string, User> usersDict = JsonConvert.DeserializeObject<Dictionary<string, User>>(File.ReadAllText("InviteData/data.json")); // 之后查找用户直接用键索引,不用遍历 var targetUser = usersDict["examplename"];
内容的提问来源于stack exchange,提问作者Samo_
相关产品推荐
相关产品推荐

