C#中使用System.Text.Json反序列化含空键JSON的问题
问题原因与解决方案
问题根源
gdalinfo返回的JSON中,bands[x].metadata结构包含一个空字符串作为键的嵌套对象,这个对象里才是统计数据。而你定义的BandMetadata类中Statistics属性,默认会尝试匹配JSON里名为"Statistics"的键,自然找不到对应数据,所以反序列化后为null。
举个典型的gdalinfo返回JSON片段:
"bands": [ { "metadata": { "": { "STATISTICS_MINIMUM": "10.2", "STATISTICS_MAXIMUM": "98.7", "STATISTICS_MEAN": "54.3", "STATISTICS_STDDEV": "12.1" } } } ]
解决方案
根据你使用的JSON序列化库,给BandMetadata的Statistics属性添加对应特性,指定空字符串作为映射键:
1. 使用System.Text.Json的情况
修改BandMetadata类:
using System.Text.Json.Serialization; public class BandMetadata { [JsonPropertyName("")] // 指定绑定空字符串键 public BandStatistics Statistics { get; set; } }
2. 使用Newtonsoft.Json(Json.NET)的情况
修改BandMetadata类:
using Newtonsoft.Json; public class BandMetadata { [JsonProperty("")] // 指定绑定空字符串键 public BandStatistics Statistics { get; set; } }
额外检查
同时要确保BandStatistics类的属性与JSON中的统计字段正确映射,比如:
// System.Text.Json示例 public class BandStatistics { [JsonPropertyName("STATISTICS_MINIMUM")] public double Minimum { get; set; } [JsonPropertyName("STATISTICS_MAXIMUM")] public double Maximum { get; set; } [JsonPropertyName("STATISTICS_MEAN")] public double Mean { get; set; } [JsonPropertyName("STATISTICS_STDDEV")] public double StdDev { get; set; } }
这样修改后,JsonSerializer.Deserialize<GdalInfo>(json)就能正确将空键下的统计数据解析到Statistics属性中。
内容的提问来源于stack exchange,提问作者Paul Meems
相关产品推荐
相关产品推荐

