You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 22:50:19