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

C#中如何将JSON反序列化为对象且保留嵌套对象为JSON字符串

解决方案:将JSON嵌套对象转为字符串赋值给目标类

针对需求——把JSON中的嵌套对象保留为JSON字符串,赋值给MyType类的string类型属性,这里提供两种可行的实现方式:

方法1:手动解析JObject处理

借助Newtonsoft.Json的JObject先解析整个JSON,再将嵌套对象直接转为字符串赋值:

using Newtonsoft.Json.Linq;

// 原始JSON字符串
string rawJson = @"
{
  ""F1"":
  { 
    ""BF1"":""BV1"",
    ""BF2"":""BV2""
  },
  ""F2"":""BF1""
}";

// 解析JSON为JObject
JObject jsonObj = JObject.Parse(rawJson);

// 构建并赋值MyType对象
MyType result = new MyType
{
    // 将嵌套的F1对象转为JSON字符串
    F1 = jsonObj["F1"].ToString(),
    // 直接读取F2的字符串值
    F2 = jsonObj["F2"].ToString()
};

这种方式适合简单场景,无需额外定义转换器,直接手动处理属性赋值。

方法2:自定义JSON转换器实现自动反序列化

如果需要多次处理这类反序列化场景,可以自定义JsonConverter,让反序列化过程自动将嵌套对象转为字符串:

步骤1:定义自定义转换器

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

public class NestedObjectToStringConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        // 指定仅处理string类型的属性
        return objectType == typeof(string);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // 若当前JSON节点是对象或数组,将其转为JSON字符串返回
        if (reader.TokenType is JsonToken.StartObject or JsonToken.StartArray)
        {
            JToken nestedToken = JToken.Load(reader);
            // 可选:用Formatting.Indented替换Formatting.None保留缩进格式
            return nestedToken.ToString(Formatting.None);
        }
        // 非嵌套节点直接返回原始字符串值
        return serializer.Deserialize(reader, objectType);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        // 支持反向序列化:将字符串解析为JSON节点写入
        try
        {
            JToken token = JToken.Parse(value.ToString());
            token.WriteTo(writer);
        }
        catch
        {
            // 若不是合法JSON,直接写入原始字符串
            writer.WriteValue(value.ToString());
        }
    }
}

步骤2:在目标类属性上标记转换器

public class MyType
{
    // 给F1属性添加转换器特性
    [JsonConverter(typeof(NestedObjectToStringConverter))]
    public string F1 { get; set; }
    public string F2 { get; set; }
}

步骤3:直接反序列化JSON

string rawJson = @"
{
  ""F1"":
  { 
    ""BF1"":""BV1"",
    ""BF2"":""BV2""
  },
  ""F2"":""BF1""
}";

// 自动完成嵌套对象转字符串的反序列化
MyType result = JsonConvert.DeserializeObject<MyType>(rawJson);

这种方式更灵活,适合批量或重复的反序列化需求,无需每次手动处理属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 09:52:25