C#使用Newtonsoft JSON反序列化匿名对象数组为List的方法
解决方法
首先,你的API返回的是JSON数组,要将其反序列化成List<dmReturn_Token_BaseMetadata>,核心问题大概率是dmReturn_Token_BaseMetadata模型与JSON字段不匹配,先确保模型定义正确:
正确的模型定义
根据你提供的JSON结构,模型需和字段名、数据类型严格对应(注意JSON字段为小写,C#属性默认大写,需通过JsonProperty特性映射):
using Newtonsoft.Json; public class dmReturn_Token_BaseMetadata { [JsonProperty("address")] public string Address { get; set; } [JsonProperty("name")] public string Name { get; set; } [JsonProperty("symbol")] public string Symbol { get; set; } [JsonProperty("decimals")] public string Decimals { get; set; } [JsonProperty("logo")] public string Logo { get; set; } [JsonProperty("logo_hash")] public string LogoHash { get; set; } [JsonProperty("thumbnail")] public string Thumbnail { get; set; } [JsonProperty("block_number")] public string BlockNumber { get; set; } // JSON中为字符串或null,用string接收 [JsonProperty("validated")] public int? Validated { get; set; } // JSON中为数字或null,用可空int接收 [JsonProperty("created_at")] public DateTime CreatedAt { get; set; } }
正确的反序列化代码
模型正确后,直接使用你尝试过的E方案即可成功:
List<dmReturn_Token_BaseMetadata> tokenMetadataList = JsonConvert.DeserializeObject<List<dmReturn_Token_BaseMetadata>>(jString);
也可以先用数组形式的D方案,再转成List:
dmReturn_Token_BaseMetadata[] tokenMetadataArray = JsonConvert.DeserializeObject<dmReturn_Token_BaseMetadata[]>(jString); List<dmReturn_Token_BaseMetadata> tokenMetadataList = tokenMetadataArray.ToList();
你之前代码失败的原因分析
- A、B、F、G:误用
DeserializeAnonymousType方法,该方法用于反序列化到匿名类型,而你需要的是强类型的列表/数组,完全没必要使用。 - C:语法错误,
DeserializeObject的泛型参数必须是明确的类型(如List<dmReturn_Token_BaseMetadata>或dmReturn_Token_BaseMetadata[]),不能是new[] {new dmReturn_Token_BaseMetadata()}这种实例化表达式。 - D、E:这两个方案本身逻辑正确,失败原因是模型与JSON字段不匹配(比如大小写未映射、数据类型错误,例如
validated定义为非可空int时,遇到JSON中的null会报错;block_number定义为int时,遇到字符串格式的数字或null也会报错)。
内容的提问来源于stack exchange,提问作者Xskode Media
相关产品推荐
相关产品推荐

