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
相关产品推荐
相关产品推荐

