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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 10:18:05