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

如何使用Newtonsoft将原始JSON字段反序列化为模型?

问题分析与解决

错误原因

  1. 冗余步骤引发问题:你中间执行的JsonConvert.Deserialize(response).ToString()完全多余,这一步会把原始JSON解析为JObject后再转回字符串,不仅多此一举,还可能破坏原始JSON格式,导致后续反序列化失败。
  2. 核心类型不匹配:你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 14:30:48