ElasticSearch响应反序列化失败:对象值始终为null
解决ElasticSearch响应反序列化后值为null的问题
看起来你遇到的问题是类结构和ElasticSearch返回的JSON层级不匹配导致的反序列化失败,我来帮你一步步修正:
问题分析
先明确你拿到的ElasticSearch响应JSON结构:
{ "hits": { "hits": [ { "_source": { "type":"test" } } ] } }
你的原类结构里,Hits直接定义了_source属性,但实际上JSON里的内层hits是一个数组,数组里的每个元素才包含_source,层级完全对不上,所以反序列化后自然都是null。
修正后的类结构
我们需要调整类来匹配JSON的层级,同时用JsonProperty特性确保属性和JSON键正确映射(C#一般用PascalCase命名,JSON多是小写/带下划线的键,这个特性能解决命名差异问题):
using Newtonsoft.Json; public class Document { [JsonProperty("hits")] public HitsContainer Hits { get; set; } } // 对应外层hits的容器对象,内部包含真正的hits数组 public class HitsContainer { [JsonProperty("hits")] public IEnumerable<HitItem> HitItems { get; set; } } // 对应hits数组里的单个元素,包含_source字段 public class HitItem { [JsonProperty("_source")] public Source Source { get; set; } } public class Source { [JsonProperty("type")] public string Type { get; set; } }
反序列化测试
现在用修正后的类来执行反序列化:
var response = "{ \"hits\": { \"hits\":[{ \"_source\": { \"type\":\"test\" } }] } }"; var result = JsonConvert.DeserializeObject<Document>(response); // 现在可以正常访问目标值了 var typeValue = result.Hits.HitItems.FirstOrDefault()?.Source.Type; // 结果为"test"
额外说明
- 如果你的C#属性名和JSON键完全一致(比如用小写的
hits代替Hits),可以不用JsonProperty,但C#推荐PascalCase命名规范,所以用特性更符合编码习惯。 - 如果你使用的是
System.Text.Json而非Newtonsoft.Json,对应特性是JsonPropertyName,用法逻辑一致。
内容的提问来源于stack exchange,提问作者Not a bug
相关产品推荐
相关产品推荐

