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

求助:使用Json.NET将JSON反序列化为指定C#字典

实现JSON到C#字典的自定义反序列化(以Symbol为键,忽略Cur字段)

没问题!我来帮你搞定这个自定义转换器的实现。你选CustomCreationConverter的思路完全正确,下面我一步步给你拆解具体怎么做:


第一步:定义实体类映射需要保留的字段

首先我们需要一个类来承载除了cur之外的JSON字段,比如:

public class SymbolData
{
    // 对应JSON里的symbol字段,作为字典的键
    public string Symbol { get; set; }
    
    // 这里添加你需要保留的其他字段,示例如下
    public decimal Price { get; set; }
    public long TradingVolume { get; set; }
    // 注意:如果JSON字段名和类属性名不一致,记得加[JsonProperty]特性,比如:
    // [JsonProperty("volume")]
    // public long TradingVolume { get; set; }
}

第二步:实现CustomCreationConverter

接下来我们继承CustomCreationConverter,并重写核心方法来完成自定义反序列化逻辑——忽略cur字段,把symbol作为字典键:

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Collections.Generic;

public class SymbolDictionaryConverter : CustomCreationConverter<Dictionary<string, SymbolData>>
{
    // 创建空字典实例
    public override Dictionary<string, SymbolData> Create(System.Type objectType)
    {
        return new Dictionary<string, SymbolData>();
    }

    // 自定义反序列化逻辑
    public override object ReadJson(JsonReader reader, System.Type objectType, object existingValue, JsonSerializer serializer)
    {
        var symbolDict = Create(objectType);
        
        // 加载JSON数组(如果你的JSON是单个对象结构,这里换成JObject.Load(reader)即可)
        var jsonArray = JArray.Load(reader);
        
        foreach (var jsonItem in jsonArray)
        {
            // 移除cur字段,让它不参与反序列化
            jsonItem.Remove("cur");
            
            // 将处理后的JSON对象转成SymbolData实例
            var data = jsonItem.ToObject<SymbolData>(serializer);
            
            // 把symbol作为键存入字典(记得做非空判断避免异常)
            if (!string.IsNullOrWhiteSpace(data.Symbol))
            {
                symbolDict[data.Symbol] = data;
            }
        }

        return symbolDict;
    }
}

第三步:使用转换器进行反序列化

最后在反序列化的时候指定我们的自定义转换器就可以了:

// 示例JSON字符串
string rawJson = @"[
    {""symbol"": ""BTC"", ""cur"": ""USD"", ""price"": 48000, ""tradingVolume"": 1200},
    {""symbol"": ""ETH"", ""cur"": ""USD"", ""price"": 2300, ""tradingVolume"": 5600}
]";

// 反序列化得到目标字典
var resultDict = JsonConvert.DeserializeObject<Dictionary<string, SymbolData>>(rawJson, new SymbolDictionaryConverter());

一些注意事项:

  • 确保你已经安装了Newtonsoft.Json(Json.NET)NuGet包,CustomCreationConverter是这个库的类;
  • 如果你的JSON根节点不是数组而是单个对象,只需要把JArray.Load(reader)改成JObject.Load(reader),然后调整遍历逻辑即可;
  • 如果symbol可能重复,记得处理字典键冲突的情况(比如用TryAdd或者覆盖旧值)。

内容的提问来源于stack exchange,提问作者N. Kit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:41:54