如何让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
相关产品推荐
相关产品推荐

