C#解析JSON时如何将嵌套对象作为字符串存入目标解析类
C# 解析JSON时将嵌套对象直接存储为字符串的实现方案
该需求完全可以实现,以下分别提供.NET生态常用的两个JSON处理库的实现方式:
方案1:使用Newtonsoft.Json(Json.NET)
方法1:使用内置JRaw类型(最简单)
直接修改映射类的属性类型为JRaw,该类型会自动保留对应节点的原始JSON内容,使用时调用ToString()即可获得字符串:
public class SampleClass { public string regularProperty {get;set;} public JRaw nestedJSON {get; set;} } // 解析后获取字符串的方式 string nestedJsonStr = obj.nestedJSON.ToString();
方法2:自定义转换器保留string属性类型
如果不想修改原有类的属性类型,可自定义JsonConverter,之后给对应属性加特性即可:
// 自定义转换器 public class RawJsonConverter : JsonConverter<string> { public override string ReadJson(JsonReader reader, Type objectType, string existingValue, bool hasExistingValue, JsonSerializer serializer) { using (var jToken = JToken.Load(reader)) { // Formatting.Indented保留缩进换行,换为Formatting.None可输出压缩后的JSON串 return jToken.ToString(Formatting.Indented); } } public override void WriteJson(JsonWriter writer, string value, JsonSerializer serializer) { writer.WriteRawValue(value); } } // 给属性加特性 public class SampleClass { public string regularProperty {get;set;} [JsonConverter(typeof(RawJsonConverter))] public string nestedJSON {get; set;} }
方案2:使用System.Text.Json(.NET Core 3.0+ 官方内置库)
官方库同样可以通过自定义转换器实现需求:
// 自定义转换器 public class RawJsonStringConverter : JsonConverter<string> { public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { // 直接获取当前节点的原始JSON字符串 return reader.GetRawText(); } public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options) { writer.WriteRawValue(value); } } // 给属性加特性 public class SampleClass { public string regularProperty {get;set;} [JsonConverter(typeof(RawJsonStringConverter))] public string nestedJSON {get; set;} }
注意:Utf8JsonReader.GetRawText() 方法从.NET 5开始支持,低版本.NET Core 3.1需要手动读取节点序列化后返回字符串。
两种方案解析后得到的nestedJSON值完全符合预期格式,如需压缩后的无换行JSON,调整对应序列化时的格式化参数即可。
内容的提问来源于stack exchange,提问作者JmukhadzeT
相关产品推荐
相关产品推荐

