如何使用System.Text.Json将字符串属性序列化为原始JSON值?
在System.Text.Json中序列化字符串属性为原始JSON文本的解决方案
要实现将指定字符串属性序列化为不带引号的原始JSON文本,你需要自定义一个JsonConverter来处理该属性的序列化逻辑,具体步骤如下:
1. 编写自定义JSON转换器
创建继承自JsonConverter<string>的转换器类,重写Write方法直接写入原始JSON内容,而非默认的带引号字符串:
public class RawStringJsonConverter : JsonConverter<string> { // 反序列化时读取原始JSON字符串 public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { using var jsonDoc = JsonDocument.ParseValue(ref reader); return jsonDoc.RootElement.GetRawText(); } // 序列化时直接写入原始JSON,不添加引号 public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options) { writer.WriteRawValue(value); } }
2. 为目标属性添加转换器特性
在需要输出原始JSON的RawValue属性上标记[JsonConverter]特性,指定使用上面的自定义转换器:
public class Demo { public int IntValue { get; set; } public string StrValue { get; set; } [JsonConverter(typeof(RawStringJsonConverter))] public string RawValue { get; set; } }
3. 执行序列化
保持原有的序列化代码不变,运行后即可得到期望的输出:
Demo obj = new Demo { IntValue = 1, StrValue = "abc", RawValue = "{\"intProp\": 123 }" }; string result = System.Text.Json.JsonSerializer.Serialize(obj); Console.WriteLine(result);
注意事项
- 确保
RawValue属性的内容是合法的JSON格式,否则会导致最终生成的JSON不合法,无法被正常解析。 - 如果不需要支持反序列化,可以简化
Read方法(比如直接抛出NotImplementedException),但建议保留完整实现以保证双向序列化的一致性。 - 不要全局注册该转换器,否则所有字符串属性都会被当作原始JSON处理,容易引发意外问题。
内容的提问来源于stack exchange,提问作者user149691
相关产品推荐
相关产品推荐

