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

C#如何将嵌套JSON反序列化为字符串?

解决嵌套JSON对象反序列化为字符串的问题

你遇到的问题本质是Json.NET默认会把changeJson对应的JSON对象解析为JObject实例,但你的实体类里该字段定义为string,类型不匹配导致反序列化失败。针对这种需要直接将嵌套JSON转为字符串的场景,自定义JSON转换器是最直接的解决方案,同时能兼容newValues/oldValues是数组或单个值的情况。

步骤1:实现自定义JsonConverter

写一个转换器,负责在反序列化时把JSON对象/值转为字符串,序列化时把字符串转回JSON结构:

public class JsonToStringConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        // 仅处理字符串类型属性
        return objectType == typeof(string);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // 读取当前JSON节点并转为字符串
        var token = JToken.Load(reader);
        // 用Formatting.None生成紧凑格式,需要缩进的话换成Formatting.Indented
        return token.ToString(Formatting.None);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        // 将字符串解析回JSON节点并写入
        if (value is string jsonStr && !string.IsNullOrWhiteSpace(jsonStr))
        {
            var token = JToken.Parse(jsonStr);
            token.WriteTo(writer);
        }
        else
        {
            writer.WriteNull();
        }
    }
}

步骤2:修改实体类配置

在ChangeJson属性上标注自定义转换器,同时注意字段名映射(JSON里的configurationType对应类里的Type,需要用JsonProperty指定):

public class AddConfigurationRequest
{
    [JsonProperty("configurationType")]
    public ConfigurationChangeType Type { get; set; }

    [JsonProperty("description")]
    public string Description { get; set; }

    [JsonProperty("changeJson")]
    [JsonConverter(typeof(JsonToStringConverter))]
    public string ChangeJson { get; set; }
}

步骤3:测试反序列化

使用常规的反序列化方法即可,此时ChangeJson会被正确转为JSON字符串:

var jsonContent = @"
{
  ""configurationType"": ""ConfigType"",
  ""description"" : ""some description"",
  ""changeJson"" : {
    ""newValues"": [ 
      { ""configKey"": ""newValue"" }
    ],
    ""oldValues"": [
      { ""configKey"": ""oldValue"" }
    ]
  }
}";

var request = JsonConvert.DeserializeObject<AddConfigurationRequest>(jsonContent);
// request.ChangeJson的值为:{"newValues":[{"configKey":"newValue"}],"oldValues":[{"configKey":"oldValue"}]}

这个方案同样兼容newValues或oldValues是单个值的情况,比如JSON里写"newValues": {"configKey": "singleValue"},反序列化后ChangeJson也能正确得到对应的字符串。

内容的提问来源于stack exchange,提问作者dbm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 12:03:28