如何在System.Text.Json序列化时将所有属性转为字符串类型?
使用System.Text.Json将数值/布尔属性序列化为字符串(不修改属性类型)
完全可以实现,不需要修改属性的原始类型,通过自定义JsonConverter就能搞定,下面分两种场景给出具体实现:
场景一:仅针对特定属性处理
如果只需要把个别属性转成字符串输出,给目标属性绑定自定义转换器即可:
1. 编写对应类型的转换器
比如处理int类型的转换器:
public class IntToStringConverter : JsonConverter<int> { // 反序列化逻辑:支持字符串或原始数值转int public override int Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType == JsonTokenType.String) { int.TryParse(reader.GetString(), out var result); return result; } return reader.GetInt32(); } // 序列化逻辑:把int转为字符串输出 public override void Write(Utf8JsonWriter writer, int value, JsonSerializerOptions options) { writer.WriteStringValue(value.ToString()); } }
同理,处理bool类型的转换器:
public class BoolToStringConverter : JsonConverter<bool> { public override bool Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType == JsonTokenType.String) { bool.TryParse(reader.GetString(), out var result); return result; } return reader.GetBoolean(); } public override void Write(Utf8JsonWriter writer, bool value, JsonSerializerOptions options) { writer.WriteStringValue(value.ToString()); } }
2. 在目标属性上标记转换器
public class MyObj { [JsonConverter(typeof(IntToStringConverter))] public int Version { get; set; } [JsonConverter(typeof(BoolToStringConverter))] public bool IsEnabled { get; set; } }
3. 执行序列化
var myObj = new MyObj { Version = 10, IsEnabled = true }; var json = JsonSerializer.Serialize(myObj); // 输出结果:{"Version":"10","IsEnabled":"True"}
场景二:全局所有数值/布尔类型统一处理
如果希望项目中所有int、bool、long等数值类型都序列化为字符串,直接在JsonSerializerOptions中全局注册转换器即可:
var serializeOptions = new JsonSerializerOptions(); serializeOptions.Converters.Add(new IntToStringConverter()); serializeOptions.Converters.Add(new BoolToStringConverter()); // 如需处理其他数值类型(如long、double),添加对应转换器即可 var myObj = new MyObj { Version = 10, IsEnabled = true }; var json = JsonSerializer.Serialize(myObj, serializeOptions); // 输出结果:{"Version":"10","IsEnabled":"True"}
注意事项
- 转换器中的
Read方法做了兼容处理,既可以解析字符串形式的数值,也能解析原始数值类型,避免反序列化时出现报错;如果不需要反序列化逻辑,可以根据需求简化,但建议保留兼容逻辑。 - 如果需要自定义字符串格式(比如bool输出"1"/"0"而不是"True"/"False"),修改转换器中
Write方法的字符串输出逻辑即可。
内容的提问来源于stack exchange,提问作者MyDaftQuestions
相关产品推荐
相关产品推荐

