如何使用System.Text.Json仅序列化对象属性内容,跳过属性名输出
问题根源
你当前的实现是为List<User>类型配置了自定义转换器,但序列化Request类时,System.Text.Json 会先输出Users属性名,再写入转换器返回的内容,自然会生成结构错误的JSON。
方案1:为Request类编写全局自定义转换器(推荐)
直接控制整个Request对象的序列化逻辑,完全跳过属性名输出阶段,代码如下:
public class RequestJsonConverter : JsonConverter<Request> { public override Request Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { // 不需要反序列化可直接抛出未实现异常 throw new NotImplementedException(); } public override void Write(Utf8JsonWriter writer, Request value, JsonSerializerOptions options) { writer.WriteStartObject(); if (value.Users != null) { for (int i = 0; i < value.Users.Count; i++) { var user = value.Users[i]; // 注意你之前的代码前缀多了个s,需求要求是user__开头而非users__ writer.WriteNumber($"user__{i}__id", user.Id); writer.WriteString($"user__{i}__email", user.Email); } } writer.WriteEndObject(); } }
使用时在序列化配置中注册转换器即可:
var options = new JsonSerializerOptions { Converters = { new RequestJsonConverter() } }; string resultJson = JsonSerializer.Serialize(yourRequestInstance, options);
方案2:用中间字典中转(无需编写转换器)
如果你不想自定义转换器,可以先把Request对象转换为展平的字典,直接序列化字典就能得到符合要求的结构:
public static Dictionary<string, object> FlattenRequest(Request request) { var dict = new Dictionary<string, object>(); if (request.Users == null) return dict; for (int i = 0; i < request.Users.Count; i++) { var user = request.Users[i]; dict.Add($"user__{i}__id", user.Id); dict.Add($"user__{i}__email", user.Email); } return dict; }
序列化时直接调用方法即可:
var flattenDict = FlattenRequest(yourRequestInstance); string resultJson = JsonSerializer.Serialize(flattenDict);
内容的提问来源于stack exchange,提问作者Simo Ferrari
相关产品推荐
相关产品推荐

