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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 00:09:23