如何为JSON对象创建C#模型类?反序列化属性为空问题
解决JSON嵌套字符串反序列化到C#模型的问题
问题根源
你的JSON数据里,每个元素的json字段是转义后的JSON字符串,而非直接的JSON对象。如果模型类里对应字段定义为普通对象类型,Newtonsoft.Json会因类型不匹配(字符串 vs 对象)导致解析失败,最终属性为空。
正确模型类定义
按JSON层级创建对应模型类,同时通过自定义转换器自动解析嵌套的JSON字符串:
// 外层数组的每个元素 public class Root { // 用自定义转换器将字符串解析为JsonContent对象 [JsonConverter(typeof(JsonStringConverter<JsonContent>))] public JsonContent Json { get; set; } public long? Principal { get; set; } } // 对应内层"json"字段的内容结构 public class JsonContent { public Listing Listing { get; set; } public long Deadline { get; set; } public string LenderPKH { get; set; } } // 对应Listing对象结构 public class Listing { public long Period { get; set; } public string AssetID { get; set; } public long Interest { get; set; } public string PolicyID { get; set; } public long Principal { get; set; } public string BorrowerPKH { get; set; } } // 自定义转换器:实现字符串到指定对象的解析 public class JsonStringConverter<T> : JsonConverter<T> { public override T ReadJson(JsonReader reader, Type objectType, T existingValue, bool hasExistingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.String) { string jsonStr = (string)reader.Value; return JsonConvert.DeserializeObject<T>(jsonStr); } return serializer.Deserialize<T>(reader); } public override void WriteJson(JsonWriter writer, T value, JsonSerializer serializer) { string jsonStr = JsonConvert.SerializeObject(value); writer.WriteValue(jsonStr); } }
反序列化代码
直接使用上述模型类执行反序列化:
var rootObj = JsonConvert.DeserializeObject<List<Root>>(serializedObj);
替代方案(无需自定义转换器)
如果不想编写自定义转换器,可分两步解析:先处理外层结构,再手动解析内层JSON字符串:
// 临时类仅处理外层结构 public class TempRoot { public string Json { get; set; } public long? Principal { get; set; } } // 分步反序列化 var tempList = JsonConvert.DeserializeObject<List<TempRoot>>(serializedObj); var rootObj = tempList.Select(temp => new Root { Json = JsonConvert.DeserializeObject<JsonContent>(temp.Json), Principal = temp.Principal }).ToList();
验证解析结果
可通过输出属性值确认解析是否成功:
foreach (var item in rootObj) { Console.WriteLine($"截止时间:{item.Json.Deadline}, 借款人PKH:{item.Json.Listing.BorrowerPKH}"); }
内容的提问来源于stack exchange,提问作者ubai erj
相关产品推荐
相关产品推荐

