如何使用Newtonsoft Json.NET反序列化内嵌JSON字符串的JSON数据
问题原因
你之前标记JsonConverter特性报错的核心原因有两个:
Newtonsoft.Json.JsonConverter是抽象基类,本身无法直接实例化,直接作为转换器类型传入会触发构造异常- 内置的泛型
JsonConverter<T>没有实现"读取字符串格式的内嵌JSON、二次反序列化为目标类型"的逻辑,无法直接处理你的场景
解决方法
1. 实现专用的内嵌JSON转换器
写一个泛型转换器,逻辑是读取属性对应的字符串值后,二次执行反序列化生成目标类型对象:
using Newtonsoft.Json; public class NestedJsonConverter<T> : JsonConverter<T> { public override T ReadJson(JsonReader reader, Type objectType, T existingValue, bool hasExistingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Null) return default; // 读取内嵌的JSON字符串 string nestedJson = reader.Value?.ToString(); if (string.IsNullOrWhiteSpace(nestedJson)) return default; // 对内嵌字符串执行二次反序列化 return JsonConvert.DeserializeObject<T>(nestedJson); } public override void WriteJson(JsonWriter writer, T value, JsonSerializer serializer) { if (value == null) { writer.WriteNull(); return; } // 序列化时将内层对象转为JSON字符串写入 writer.WriteValue(JsonConvert.SerializeObject(value)); } }
2. 定义数据模型,在嵌套字段上标记自定义转换器
对应给出的JSON结构,按实际业务类型定义模型,嵌套JSON对应的属性上标记刚才实现的转换器,泛型参数传入提前定义好的内层类型(比如你提到的PianoRhythmLessonData):
// 示例:内层嵌套JSON对应的模型,根据实际业务替换即可 public class InnerNestData { public bool Test { get; set; } } // 外层JSON模型 public class RootModel { [JsonProperty("character")] public string Character { get; set; } // 嵌套JSON字段标记自定义转换器,泛型参数替换为自己的内层类型即可 [JsonProperty("json")] [JsonConverter(typeof(NestedJsonConverter<InnerNestData>))] public InnerNestData NestedData { get; set; } }
3. 正常调用反序列化方法
不需要额外传参,直接调用标准的JsonConvert.DeserializeObject<T>()即可:
string rawJson = @"{ ""character"": ""Someone"", ""json"": ""{\""test\"":true}"" }"; var result = JsonConvert.DeserializeObject<RootModel>(rawJson); // 执行后result.NestedData.Test的值为true,符合预期
注意事项
- 不要直接将抽象基类
JsonConverter、无自定义逻辑的内置泛型JsonConverter<T>作为转换器标记到属性上,这就是之前遇到"缺少无参数构造函数"报错的直接原因 - 如果内嵌JSON字符串存在格式错误、结构和内层类型不匹配的问题,二次反序列化阶段会正常抛出JSON解析异常,可根据业务需要加异常捕获
- 如果只需要反序列化、不需要把模型再序列化回原格式,
WriteJson方法可以直接抛出NotImplementedException,不影响反序列化逻辑
内容的提问来源于stack exchange,提问作者user16448747
相关产品推荐
相关产品推荐

