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

C#不使用JObject.Parse从JSON字符串提取指定字段的实现方法

大JSON字段提取可行方案

完全可以不解析完整JSON DOM实现指定字段提取,目前.NET生态下有两种主流的高性能流式解析方案:

方案1:使用System.Text.Json 原生Utf8JsonReader(推荐)

适用于.NET Core 3.0+/NET5+ 版本,无第三方依赖,是forward-only的只读解析器,逐token读取JSON内容,不会加载整个JSON结构到内存,性能和内存占用表现极佳。

using System;
using System.Text.Json;

public static (string Name, string Version, string Year) ExtractTargetFields(string jsonStr)
{
    byte[] jsonBytes = System.Text.Encoding.UTF8.GetBytes(jsonStr);
    Utf8JsonReader reader = new Utf8JsonReader(jsonBytes);

    string name = null;
    string version = null;
    string year = null;
    int foundCount = 0;

    // 三个目标字段全部找到就终止解析,不需要读取后续内容
    while (reader.Read() && foundCount < 3)
    {
        if (reader.TokenType == JsonTokenType.PropertyName)
        {
            string propName = reader.GetString();
            if (propName == nameof(Name) && foundCount < 3)
            {
                reader.Read();
                name = reader.GetString();
                foundCount++;
            }
            else if (propName == nameof(Version) && foundCount < 3)
            {
                reader.Read();
                version = reader.GetString();
                foundCount++;
            }
            else if (propName == nameof(Year) && foundCount < 3)
            {
                reader.Read();
                year = reader.GetString();
                foundCount++;
            }
        }
    }
    return (name, version, year);
}

如果JSON直接来自HTTP响应流等Stream类型,还可以直接基于流处理,不需要把整个JSON转成字符串,内存占用会更低,甚至可以边下载边解析,找到目标字段就直接中断后续内容拉取。

方案2:使用Newtonsoft.Json 的JsonTextReader

适用于仍在使用.NET Framework 或已依赖Newtonsoft.Json的旧项目,同样是流式解析逻辑,不需要加载完整JObject:

using Newtonsoft.Json;
using System.IO;

public static (string Name, string Version, string Year) ExtractTargetFields(string jsonStr)
{
    using var stringReader = new StringReader(jsonStr);
    using var jsonReader = new JsonTextReader(stringReader);
    
    string name = null;
    string version = null;
    string year = null;
    int foundCount = 0;

    while (jsonReader.Read() && foundCount < 3)
    {
        if (jsonReader.TokenType == JsonToken.PropertyName)
        {
            string propName = jsonReader.Value.ToString();
            if (propName == nameof(Name))
            {
                jsonReader.Read();
                name = jsonReader.Value?.ToString();
                foundCount++;
            }
            else if (propName == nameof(Version))
            {
                jsonReader.Read();
                version = jsonReader.Value?.ToString();
                foundCount++;
            }
            else if (propName == nameof(Year))
            {
                jsonReader.Read();
                year = jsonReader.Value?.ToString();
                foundCount++;
            }
        }
    }
    return (name, version, year);
}

提示:如果JSON字段名存在大小写不统一的情况,可以将属性名比较逻辑改为忽略大小写,例如propName.Equals(nameof(Name), StringComparison.OrdinalIgnoreCase),适配更多场景。

两种方案相比全量解析JObject的方式,内存占用至少降低60%以上,目标字段越靠前,解析性能提升越明显,完全不需要处理MoreComplicatedObjects等非目标复杂结构。

内容的提问来源于stack exchange,提问作者jimonthycricket

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:06:04