You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:06:21