C# .NET Core中如何使用System.Text.Json将字符串转换为对象
解析失败原因
- 原始请求字符串存在HTML转义字符:你拿到的内容里
"是双引号的HTML编码格式,需要先解码才能正常解析。 - JSON格式不符合标准规范:
Abc字段的字符串值用单引号'包裹,System.Text.Json默认严格遵循JSON标准,不支持单引号作为字符串边界,和Newtonsoft.Json的默认宽松策略不同。 Abc字段存储的是序列化后的JSON字符串,不是直接嵌套对象,需要二次反序列化才能得到对应实体。
解决步骤
1. 预处理原始请求字符串
先对原始请求做HTML解码,消除"这类转义字符:
string rawRequest = "你拿到的原始请求字符串"; string decodedJson = System.Net.WebUtility.HtmlDecode(rawRequest);
2. 定义对应实体类
分别定义外层容器类和Abc对应的内层实体类:
// 外层容器实体 public class RootClass { public string Abc { get; set; } } // Abc字段对应的内层实体 public class AbcContent { public string Property1 { get; set; } public string Property2 { get; set; } }
3. 配置反序列化参数并执行解析
开启单引号支持,按需开启忽略属性大小写适配不同命名格式:
var jsonOptions = new JsonSerializerOptions { // 允许单引号包裹字符串 AllowSingleQuotes = true, // 忽略属性名大小写,适配示例中property2小写的场景,不需要可以关闭 PropertyNameCaseInsensitive = true }; // 第一步反序列化外层对象 var root = JsonSerializer.Deserialize<RootClass>(decodedJson, jsonOptions); // 第二步反序列化Abc字段的字符串内容为内层对象 var abcContent = JsonSerializer.Deserialize<AbcContent>(root.Abc, jsonOptions);
进阶优化方案
如果不想每次手动执行二次反序列化,可以自定义JsonConverter实现自动解析:
// 通用嵌套JSON字符串转换器 public class NestedJsonConverter<T> : JsonConverter<T> { public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { var nestedJson = reader.GetString(); return JsonSerializer.Deserialize<T>(nestedJson, options); } public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options) { writer.WriteStringValue(JsonSerializer.Serialize(value, options)); } }
修改外层实体类的属性标记,直接指定转换器:
public class RootClass { [JsonConverter(typeof(NestedJsonConverter<AbcContent>))] public AbcContent Abc { get; set; } }
配置完成后直接一次反序列化即可得到完整对象:
var result = JsonSerializer.Deserialize<RootClass>(decodedJson, jsonOptions);
内容的提问来源于stack exchange,提问作者prasanthi
相关产品推荐
相关产品推荐

