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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 15:52:44