如何在C#中读取JSON数组并提取指定虚拟币的价格?
在C#中提取指定虚拟币价格的实现方案
这是个非常常见的JSON数据处理需求,在C#里我们可以借助成熟的序列化库来高效完成。下面我会给出两种主流的实现方式,分别是广泛使用的Newtonsoft.Json(Json.NET)和.NET Core之后自带的System.Text.Json,你可以根据自己的项目环境选择。
第一步:定义数据模型
首先我们需要创建一个实体类来映射JSON中的字段,这样反序列化后可以方便地通过对象属性访问数据。考虑到价格是数值类型,我们用decimal来存储(比double更适合处理货币类数据,避免精度丢失):
public class CryptoCurrency { public string Id { get; set; } public string Name { get; set; } public string Symbol { get; set; } public string Rank { get; set; } [JsonPropertyName("price_usd")] // System.Text.Json需要该特性映射下划线字段;Json.NET可改用[JsonProperty("price_usd")]或开启驼峰命名自动映射 public decimal PriceUsd { get; set; } // 其他不需要的字段可以直接省略,只保留业务需要的属性即可 }
方法一:使用Newtonsoft.Json(Json.NET)
这是.NET生态中使用最广泛的JSON处理库,兼容所有.NET版本。
1. 安装NuGet包
如果项目还没安装,在NuGet包管理器中搜索Newtonsoft.Json并安装,或者在Package Manager Console执行:
Install-Package Newtonsoft.Json
2. 完整实现代码
using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; class Program { static void Main() { // 你的原始JSON字符串 string json = @"[ { ""id"": ""bitcoin"", ""name"": ""Bitcoin"", ""symbol"": ""BTC"", ""rank"": ""1"", ""price_usd"": ""15235.5"", ""price_btc"": ""1.0"", ""24h_volume_usd"": ""17910600000.0"", ""market_cap_usd"": ""255647119350"", ""available_supply"": ""16779700.0"", ""total_supply"": ""16779700.0"", ""max_supply"": ""21000000.0"", ""percent_change_1h"": ""0.36"", ""percent_change_24h"": ""8.91"", ""percent_change_7d"": ""-3.41"", ""last_updated"": ""1514994260"" }, { ""id"": ""ripple"", ""name"": ""Ripple"", ""symbol"": ""XRP"", ""rank"": ""2"", ""price_usd"": ""2.88573"", ""price_btc"": ""0.00019146"", ""24h_volume_usd"": ""4799670000.0"", ""market_cap_usd"": ""111790712459"", ""available_supply"": ""38739144847.0"", ""total_supply"": ""99993093880.0"", ""max_supply"": ""100000000000"", ""percent_change_1h"": ""0.88"", ""percent_change_24h"": ""19.54"", ""percent_change_7d"": ""120.16"", ""last_updated"": ""1514994241"" } ]"; // 反序列化JSON到实体列表 List<CryptoCurrency> cryptoList = JsonConvert.DeserializeObject<List<CryptoCurrency>>(json); // 定义要查询的币种符号 List<string> targetSymbols = new List<string> { "BTC", "XRP" }; // 遍历查询并输出结果 foreach (var symbol in targetSymbols) { var crypto = cryptoList.FirstOrDefault(c => c.Symbol.Equals(symbol, StringComparison.OrdinalIgnoreCase)); if (crypto != null) { Console.WriteLine($"{crypto.Symbol} price: {crypto.PriceUsd}$"); } else { Console.WriteLine($"{symbol} not found in the data"); } } } }
方法二:使用System.Text.Json(.NET Core 3.0+ / .NET 5+)
如果你的项目基于较新的.NET版本,System.Text.Json是官方自带的库,无需额外安装NuGet包,性能表现也很出色。
完整实现代码
using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; class Program { static void Main() { // 你的原始JSON字符串 string json = @"[ { ""id"": ""bitcoin"", ""name"": ""Bitcoin"", ""symbol"": ""BTC"", ""rank"": ""1"", ""price_usd"": ""15235.5"", ""price_btc"": ""1.0"", ""24h_volume_usd"": ""17910600000.0"", ""market_cap_usd"": ""255647119350"", ""available_supply"": ""16779700.0"", ""total_supply"": ""16779700.0"", ""max_supply"": ""21000000.0"", ""percent_change_1h"": ""0.36"", ""percent_change_24h"": ""8.91"", ""percent_change_7d"": ""-3.41"", ""last_updated"": ""1514994260"" }, { ""id"": ""ripple"", ""name"": ""Ripple"", ""symbol"": ""XRP"", ""rank"": ""2"", ""price_usd"": ""2.88573"", ""price_btc"": ""0.00019146"", ""24h_volume_usd"": ""4799670000.0"", ""market_cap_usd"": ""111790712459"", ""available_supply"": ""38739144847.0"", ""total_supply"": ""99993093880.0"", ""max_supply"": ""100000000000"", ""percent_change_1h"": ""0.88"", ""percent_change_24h"": ""19.54"", ""percent_change_7d"": ""120.16"", ""last_updated"": ""1514994241"" } ]"; // 配置反序列化选项:忽略大小写(可选,根据你的需求调整) var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; // 反序列化JSON到实体列表 List<CryptoCurrency> cryptoList = JsonSerializer.Deserialize<List<CryptoCurrency>>(json, options); // 定义要查询的币种符号 List<string> targetSymbols = new List<string> { "BTC", "XRP" }; // 遍历查询并输出结果 foreach (var symbol in targetSymbols) { var crypto = cryptoList.FirstOrDefault(c => c.Symbol.Equals(symbol, StringComparison.OrdinalIgnoreCase)); if (crypto != null) { Console.WriteLine($"{crypto.Symbol} price: {crypto.PriceUsd}$"); } else { Console.WriteLine($"{symbol} not found in the data"); } } } } // 实体类(注意JsonPropertyName特性映射JSON中的下划线字段) public class CryptoCurrency { public string Id { get; set; } public string Name { get; set; } public string Symbol { get; set; } public string Rank { get; set; } [JsonPropertyName("price_usd")] public decimal PriceUsd { get; set; } }
运行结果
两种方法运行后都会输出:
BTC price: 15235.5$ XRP price: 2.88573$
额外提示
- 如果JSON中的
price_usd可能为null或空字符串,建议把模型中的PriceUsd定义为decimal?(可空类型),避免反序列化报错。 - 虽然可以用
dynamic类型直接处理JSON,但静态类型的实体类更安全,能提供编译时检查,推荐使用。
内容的提问来源于stack exchange,提问作者Wassim Dernayka
相关产品推荐
相关产品推荐

