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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:03:08