如何使用Newtonsoft将原始JSON字段反序列化为模型?
问题分析与解决
错误原因
- 冗余步骤引发问题:你中间执行的
JsonConvert.Deserialize(response).ToString()完全多余,这一步会把原始JSON解析为JObject后再转回字符串,不仅多此一举,还可能破坏原始JSON格式,导致后续反序列化失败。 - 核心类型不匹配:你的JSON中
sub字段是转义后的JSON字符串,但实体类Main的Sub属性是Sub类型,Json.NET无法直接将字符串自动转换为Sub对象,因此抛出异常。
解决方案
方案一:分两步反序列化
先把原始JSON反序列化为临时类(其中Sub属性为字符串类型),再单独解析sub字段为Sub对象,最后组装成目标Main对象:
// 临时类,用于接收原始JSON结构 public class TempMain { public string Name { get; set; } public string Sub { get; set; } } // 反序列化流程 var response = Encoding.UTF8.GetString(bytes); var tempModel = JsonConvert.DeserializeObject<TempMain>(response); var mainModel = new Main { Name = tempModel.Name, Sub = JsonConvert.DeserializeObject<Sub>(tempModel.Sub) };
方案二:使用自定义JsonConverter
通过自定义转换器,让Json.NET自动处理sub字段从字符串到Sub对象的转换,这样可以直接反序列化为Main对象:
public class SubStringConverter : JsonConverter<Sub> { public override Sub ReadJson(JsonReader reader, Type objectType, Sub existingValue, bool hasExistingValue, JsonSerializer serializer) { // 读取字符串内容并反序列化为Sub对象 var subJson = reader.Value.ToString(); return JsonConvert.DeserializeObject<Sub>(subJson); } public override void WriteJson(JsonWriter writer, Sub value, JsonSerializer serializer) { // 若需要序列化回JSON字符串,可在此处理(可选) var subJson = JsonConvert.SerializeObject(value); writer.WriteValue(subJson); } } // 应用转换器完成反序列化 var response = Encoding.UTF8.GetString(bytes); var settings = new JsonSerializerSettings { Converters = new List<JsonConverter> { new SubStringConverter() } }; var mainModel = JsonConvert.DeserializeObject<Main>(response, settings);
额外提醒
务必移除代码中多余的JsonConvert.Deserialize(response).ToString()步骤,直接使用原始的response字符串进行反序列化即可。
内容的提问来源于stack exchange,提问作者barteloma
相关产品推荐
相关产品推荐

