You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:09:12