使用Newtonsoft反序列化时,如何为C# Worker对象保留完整JSON属性?
嘿,这个需求挺实用的,刚好有几个靠谱的方案能帮你实现,我给你详细说说:
方案1:先解析JSON结构,手动给每个Worker赋值完整JSON
这个方法最直观,不需要复杂的自定义逻辑,适合快速落地:
首先给你的Worker类新增存储完整JSON的属性:
public class Worker { public string AssociateOID { get; set; } // 新增的属性,用来存当前Worker对应的完整JSON public string FullJson { get; set; } // 你已有的其他属性... }
然后在反序列化的时候,先把原始JSON解析成JArray(因为你要处理的是列表),遍历每个JSON节点,先把节点转成字符串存到FullJson,再反序列化成Worker对象:
// 假设restResponseJson是你从REST请求拿到的原始JSON字符串 JArray workerJsonArray = JArray.Parse(restResponseJson); List<Worker> workerList = new List<Worker>(); foreach (JObject workerJsonObj in workerJsonArray) { Worker worker = workerJsonObj.ToObject<Worker>(); // 把当前Worker的完整JSON片段存到属性里,用Formatting.None可以压缩JSON体积 worker.FullJson = workerJsonObj.ToString(Formatting.None); workerList.Add(worker); }
方案2:用自定义JsonConverter自动捕获原始JSON
如果想让反序列化过程更自动化,不用手动遍历,可以写一个自定义转换器,让Newtonsoft在反序列化时自动帮你把原始JSON存到属性里:
首先实现自定义转换器:
public class WorkerWithFullJsonConverter : JsonConverter<Worker> { public override Worker ReadJson(JsonReader reader, Type objectType, Worker existingValue, bool hasExistingValue, JsonSerializer serializer) { // 先把当前JSON节点加载成JObject,这样就能拿到完整的JSON内容 JObject workerJsonObj = JObject.Load(reader); // 反序列化成Worker对象 Worker worker = workerJsonObj.ToObject<Worker>(serializer); // 给新增的属性赋值 worker.FullJson = workerJsonObj.ToString(Formatting.None); return worker; } public override void WriteJson(JsonWriter writer, Worker value, JsonSerializer serializer) { // 如果后续需要把Worker序列化回JSON,这里可以按需实现,比如忽略FullJson或者正常序列化 JObject workerJsonObj = JObject.FromObject(value); workerJsonObj.WriteTo(writer); } }
接下来有两种方式使用这个转换器:
- 方式一:给
Worker类加特性标记,全局生效
[JsonConverter(typeof(WorkerWithFullJsonConverter))] public class Worker { public string AssociateOID { get; set; } public string FullJson { get; set; } // 其他属性... } // 直接反序列化即可,转换器会自动工作 List<Worker> workerList = JsonConvert.DeserializeObject<List<Worker>>(restResponseJson);
- 方式二:反序列化时临时指定转换器,灵活可控
List<Worker> workerList = JsonConvert.DeserializeObject<List<Worker>>( restResponseJson, new WorkerWithFullJsonConverter() );
小提示
- 如果担心数据库存储体积,推荐用
Formatting.None生成压缩后的JSON字符串;如果需要可读性,换成Formatting.Indented即可。 - 两种方案都能满足需求,方案1简单直接,适合小场景;方案2更优雅,适合需要多次复用的业务场景。
内容的提问来源于stack exchange,提问作者Jason Webber
相关产品推荐
相关产品推荐

