繁体   English   中英

未反序列化ElasticSearch NEST GET响应

[英]ElasticSearch NEST GET response not deserialized

我们从第三方连接到ElasticSearch,以使用NEST nuget包获取一些数据。 但是,如果使用GET <>调用,则在强类型POCO中不会反序列化响应。 HTTP调用成功,并且体内有一个带有数据的json对象。

var result = _elasticSearchClient.Get<Contractor>(188153, request => request
.Index("{index_name}")
.Type("{type_name}"));

--POCO. Naming of the property as in the json message
public class Contractor
{
public int contractor_id { get; set; }
public string type { get; set; }
public string type_description { get; set; }
public string contractor_code { get; set; }
public string name { get; set; }
...
}

使用HttpClient和JsonCovert进行反序列化的调用

var response = Task.Run(() => _httpClient.GetAsync(url)).Result;
var responseMessage = Task.Run(() => response.Content.ReadAsStringAsync()).Result;
var contractor = JsonConvert.DeserializeObject<Contractor>(responseMessage);

ElasticSearchClient的配置

var url = new Uri($"{BaseUrl}");

var connectionSettings = new ConnectionSettings(url);
connectionSettings.ClientCertificate(GetCertificateFromStore());
connectionSettings.BasicAuthentication(Username, Password);
connectionSettings.ThrowExceptions();
connectionSettings.PrettyJson();
connectionSettings.DisableDirectStreaming();
connectionSettings.DefaultFieldNameInferrer(p => p);

var elasticSearchClient = new ElasticClient(connectionSettings);

DebugInformation:有效的NEST响应是由对GET的成功低级调用生成的:/ {index_name} / {type_name} / 188153?pretty = true

此API调用的审核跟踪:-[1] HealthyResponse:节点:https:// {baseUrl} /接收:00:00:01.0835021请求:请求流未捕获或已被序列化程序读取完成。 在ConnectionSettings上设置DisableDirectStreaming()以强制在响应上进行设置。

响应:

{
  "_index" : "{index_name}",
  "_type" : "{type_name}",
  "_id" : "188153",
  "_version" : 1,
  "found" : true,
  "_source" : {
    "contractor" : {
      "contractor_id" : 188153,
      "type" : "OVE",
      "type_description" : "Overig",
      "contractor_code" : "RES0000826",
      "name" : "OrganizationName", 
   }
}

NEST NuGet软件包5.6.0

Elasticsearch 6.0.0版

我想念什么?

NEST不会反序列化它,因为Elasticsearch中的_source文档是一个具有一个属性"contractor"的对象,其值是一个包含属性的对象。

为了正确反序列化,Elasticsearch中的_source文档需要

  "_source" : {
      "contractor_id" : 188153,
      "type" : "OVE",
      "type_description" : "Overig",
      "contractor_code" : "RES0000826",
      "name" : "OrganizationName"
   }

或者 ,POCO应该类似于

public class ContractorWrapper //choose any type name you like :)
{
    public Contractor contractor { get;set; }
}

匹配JSON结构。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM