C#如何将嵌套JSON反序列化为字符串?
解决嵌套JSON对象反序列化为字符串的问题
你遇到的问题本质是Json.NET默认会把changeJson对应的JSON对象解析为JObject实例,但你的实体类里该字段定义为string,类型不匹配导致反序列化失败。针对这种需要直接将嵌套JSON转为字符串的场景,自定义JSON转换器是最直接的解决方案,同时能兼容newValues/oldValues是数组或单个值的情况。
步骤1:实现自定义JsonConverter
写一个转换器,负责在反序列化时把JSON对象/值转为字符串,序列化时把字符串转回JSON结构:
public class JsonToStringConverter : JsonConverter { public override bool CanConvert(Type objectType) { // 仅处理字符串类型属性 return objectType == typeof(string); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { // 读取当前JSON节点并转为字符串 var token = JToken.Load(reader); // 用Formatting.None生成紧凑格式,需要缩进的话换成Formatting.Indented return token.ToString(Formatting.None); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { // 将字符串解析回JSON节点并写入 if (value is string jsonStr && !string.IsNullOrWhiteSpace(jsonStr)) { var token = JToken.Parse(jsonStr); token.WriteTo(writer); } else { writer.WriteNull(); } } }
步骤2:修改实体类配置
在ChangeJson属性上标注自定义转换器,同时注意字段名映射(JSON里的configurationType对应类里的Type,需要用JsonProperty指定):
public class AddConfigurationRequest { [JsonProperty("configurationType")] public ConfigurationChangeType Type { get; set; } [JsonProperty("description")] public string Description { get; set; } [JsonProperty("changeJson")] [JsonConverter(typeof(JsonToStringConverter))] public string ChangeJson { get; set; } }
步骤3:测试反序列化
使用常规的反序列化方法即可,此时ChangeJson会被正确转为JSON字符串:
var jsonContent = @" { ""configurationType"": ""ConfigType"", ""description"" : ""some description"", ""changeJson"" : { ""newValues"": [ { ""configKey"": ""newValue"" } ], ""oldValues"": [ { ""configKey"": ""oldValue"" } ] } }"; var request = JsonConvert.DeserializeObject<AddConfigurationRequest>(jsonContent); // request.ChangeJson的值为:{"newValues":[{"configKey":"newValue"}],"oldValues":[{"configKey":"oldValue"}]}
这个方案同样兼容newValues或oldValues是单个值的情况,比如JSON里写"newValues": {"configKey": "singleValue"},反序列化后ChangeJson也能正确得到对应的字符串。
内容的提问来源于stack exchange,提问作者dbm
相关产品推荐
相关产品推荐

