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

如何让Newtonsoft反序列化时自动为带OriginalString属性的对象赋值原始字符串

自动为带OriginalString属性的类型保存反序列化原始JSON字符串

要实现Newtonsoft.Json反序列化时,自动为所有带有OriginalString字符串属性的类型赋值原始JSON字符串,可以通过自定义JsonConverter完成,具体步骤如下:

  • 步骤1:创建自定义Json转换器
    该转换器会检查目标类型是否包含可写的OriginalString字符串属性,在反序列化时捕获原始JSON并赋值给该属性:

    public class OriginalStringConverter : JsonConverter
    {
        // 缓存类型检查结果,避免重复反射开销
        private readonly Dictionary<Type, PropertyInfo> _cachedProps = new Dictionary<Type, PropertyInfo>();
    
        public override bool CanConvert(Type objectType)
        {
            if (_cachedProps.TryGetValue(objectType, out var prop))
                return prop != null;
    
            var originalStringProp = objectType.GetProperty(
                "OriginalString", 
                BindingFlags.Public | BindingFlags.Instance);
            
            var isValid = originalStringProp != null 
                          && originalStringProp.PropertyType == typeof(string) 
                          && originalStringProp.CanWrite;
            
            _cachedProps[objectType] = isValid ? originalStringProp : null;
            return isValid;
        }
    
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            // 读取原始JSON内容
            var jToken = JToken.Load(reader);
            var rawJson = jToken.ToString(Formatting.None);
            
            // 反序列化得到目标对象
            var targetObj = jToken.ToObject(objectType, serializer);
            
            // 赋值OriginalString属性
            _cachedProps[objectType].SetValue(targetObj, rawJson);
            
            return targetObj;
        }
    
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            // 序列化时使用默认逻辑,无需特殊处理
            serializer.Serialize(writer, value);
        }
    }
    
  • 步骤2:配置并使用转换器
    将自定义转换器添加到JsonSerializerSettings中,后续所有反序列化操作都会自动生效:

    // 全局配置转换器(可放在项目启动初始化代码中)
    var jsonSettings = new JsonSerializerSettings();
    jsonSettings.Converters.Add(new OriginalStringConverter());
    
    // 正常调用反序列化方法,无需手动赋值OriginalString
    var foo = JsonConvert.DeserializeObject<Foo>(fooAsString, jsonSettings);
    

注意事项

  • 确保目标类型的OriginalString属性是public、可写的字符串类型;
  • 转换器会自动过滤不满足条件的类型,不会影响其他类型的反序列化逻辑;
  • 缓存机制避免了重复反射,提升了批量反序列化的性能。

内容的提问来源于stack exchange,提问作者Kilas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 20:11:09