求助:使用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
相关产品推荐
相关产品推荐

