如何在JToken.ToObject()中控制JSON文本的格式?
问题解答
首先明确:ToObject()方法本身没有提供类似Formatting.None的格式化选项。因为ToObject()的核心作用是将JSON反序列化为.NET对象,反序列化过程中会严格保留字符串类型字段的原始内容——原JSON中value字段带空格的JSON字符串,反序列化后自然会保留这些多余的格式字符。
针对你的问题,有两种可行的解决思路:
1. 手动遍历处理(优化版)
遍历所有Answer对象,判断Value是否为合法JSON,若是则重新序列化为无格式字符串:
var answers = (Collection<Answer>)data["answers"].ToObject(typeof(Collection<Answer>)); foreach (var answer in answers) { if (string.IsNullOrWhiteSpace(answer.Value)) continue; try { // 尝试解析为JSON token,判断是否是合法JSON var jsonToken = JToken.Parse(answer.Value); // 以无格式重新序列化,去除多余空格 answer.Value = jsonToken.ToString(Formatting.None); } catch (JsonReaderException) { // 不是合法JSON,保持原内容不变 continue; } }
2. 自定义JsonConverter(更优雅的复用方案)
通过自定义转换器,在反序列化Answer类的Value字段时自动处理格式问题,无需手动遍历:
第一步:实现自定义转换器
public class JsonStringNormalizerConverter : JsonConverter<string> { public override string ReadJson(JsonReader reader, Type objectType, string existingValue, bool hasExistingValue, JsonSerializer serializer) { var rawValue = reader.Value?.ToString(); if (string.IsNullOrWhiteSpace(rawValue)) return rawValue; try { var jsonToken = JToken.Parse(rawValue); return jsonToken.ToString(Formatting.None); } catch (JsonReaderException) { // 非合法JSON,返回原始值 return rawValue; } } public override void WriteJson(JsonWriter writer, string value, JsonSerializer serializer) { writer.WriteValue(value); } }
第二步:给Answer类的Value字段添加特性
public class Answer { public string Label { get; set; } [JsonConverter(typeof(JsonStringNormalizerConverter))] public string Value { get; set; } }
之后再调用ToObject()解析时,会自动处理Value字段中的JSON字符串,去除多余格式。
内容的提问来源于stack exchange,提问作者GendoIkari
相关产品推荐
相关产品推荐

