如何在C#中将Firebase键值对列表转换为Person类对象列表
问题描述
我从Firebase获取用户列表,但返回的是键值对(KVP)数据:
{[FirstName, Eric]} {[LastNae, EricLastName]} {[Email, Eric@yahoo.com]} {[Phone, 12345]}
需要将该键值对列表转换为Person类类型的对象列表,Person类定义如下:
Person { string FirstName {get; set;} string LastName {get; set;} string Email {get; set;} string Phone {get; set;} }
请问最快且最高效的转换方式是什么?
高效转换方案
1. 手动映射(性能最优)
这是最快的实现方式,完全避免反射或序列化的额外开销,适合对性能要求极高的场景:
// 假设从Firebase获取的键值对集合为List<Dictionary<string, object>> var firebaseKvpList = GetFirebaseUserKvpData(); var personList = new List<Person>(); foreach (var kvpSet in firebaseKvpList) { var person = new Person(); // 逐个匹配键值对赋值,处理示例中存在的键名拼写问题(LastNae) if (kvpSet.TryGetValue("FirstName", out var firstNameVal)) person.FirstName = firstNameVal.ToString(); if (kvpSet.TryGetValue("LastNae", out var lastNameVal)) person.LastName = lastNameVal.ToString(); if (kvpSet.TryGetValue("Email", out var emailVal)) person.Email = emailVal.ToString(); if (kvpSet.TryGetValue("Phone", out var phoneVal)) person.Phone = phoneVal.ToString(); personList.Add(person); }
2. 序列化库转换(兼顾性能与简洁性)
如果字段较多不想写重复赋值代码,用System.Text.Json或Newtonsoft.Json序列化是不错的选择,性能接近手动映射,代码更简洁:
using System.Text.Json; var personList = new List<Person>(); foreach (var kvpSet in firebaseKvpList) { // 将键值对集合序列化为JSON字符串 var jsonStr = JsonSerializer.Serialize(kvpSet); // 反序列化为Person对象 var person = JsonSerializer.Deserialize<Person>(jsonStr); personList.Add(person); }
如果键名和类属性名不匹配(比如示例中的LastNae vs LastName),可以在Person类上加特性适配:
public class Person { public string FirstName { get; set; } [JsonPropertyName("LastNae")] public string LastName { get; set; } public string Email { get; set; } public string Phone { get; set; } }
3. 不推荐:反射转换
反射会带来明显的性能损耗,仅适合极端动态的场景,不建议作为常规方案使用。
内容的提问来源于stack exchange,提问作者CodeMan03
相关产品推荐
相关产品推荐

