c# - 如何在 Elasticsearch NEST 中序列化 JToken 或 JObject 类型的属性?

标签 c# elasticsearch json.net nest elasticsearch-net

我正在将 Elasticsearch 引入到 C# API 项目中。我想利用现有的 API 模型作为搜索文档,其中许多模型允许添加自定义数据点。这些是使用 JObject 实现的从 Json.NET 输入。例如:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public JObject ExtraProps { get; set; }
}

这允许用户像这样发送 JSON 请求主体,效果很好:

{
   "Id": 123,
   "Name": "Thing",
   "ExtraProps": {
      "Color": "red",
      "Size": "large"
   }
}

但是,如果我在 NEST 中使用它作为文档类型,那些额外的属性会以某种方式丢失它们的值,序列化为:

{
   "Id": 123,
   "Name": "Thing",
   "ExtraProps": {
      "Color": [],
      "Size": []
   }
}

添加 [Nest.Object]属性为 ExtraProps没有改变行为。据我了解,NEST 在内部使用 Json.NET,因此我不认为它会遇到 Json.NET 类型的问题。有没有相对简单的修复方法?

以下是我正在权衡的一些选项:

  1. 使用 custom serialization .我开始沿着这条路走下去,感觉比它应该的要复杂得多,而且我从来没有让它发挥作用。

  2. map JObject s 至 Dictionary<string, object>秒。我已经验证了这项工作,但如果有嵌套对象(可能有),我需要用递归来增强它。而且,理想情况下,我希望它能与更通用的 JToken 一起使用类型。这是我倾向于的选项,但同样,它感觉比它应该的更复杂。

  3. 使用 "Low Level" client甚至原始 HTTP 调用。不可否认,我还没有探索过这个,但如果它真的比其他选择更简单/更干净,我愿意接受。

  4. 将此报告为错误。无论如何,我可能会这样做。我只是有一种预感,这应该JObject一起工作或任何 JToken开箱即用,除非有某种原因表明这是预期行为。

最佳答案

这是 NEST 6.x 的预期行为。

NEST 使用 Json.NET 进行序列化。然而,在 NEST 6.x 中,此依赖项通过

在 NEST 程序集中内化
  • IL-将所有 Json.NET 类型合并到 NEST 程序集中
  • 将 Newtonsoft.Json 中的类型重命名为 Nest.Json
  • 标记所有类型内部

There's a blog post with further details解释这一变化背后的动机。

当涉及到处理 Json.NET 类型(例如 Newtonsoft.Json.Linq.JObject)时,Json.NET 对这些类型进行序列化/反序列化有特殊处理。使用 NEST 6.x,内部化的 Json.NET 不知道如何专门处理 Newtonsoft.Json.Linq.JObject,因为内部化的 Json.NET 中的所有类型都已重命名空间到 Nest .Json 命名空间。

要支持 Json.NET 类型,需要连接使用 Json.NET 序列化文档的序列化程序。 NEST.JsonNetSerializer nuget package是为了帮助解决这个问题而创建的。只需将对 NEST.JsonNetSerializer 的引用添加到您的项目中,然后按如下方式连接序列化程序

// choose the appropriate IConnectionPool for your use case
var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
var connectionSettings =
    new ConnectionSettings(pool, JsonNetSerializer.Default);
var client = new ElasticClient(connectionSettings);

有了这个地方,具有 JObject 属性的文档将按预期序列化。

关于c# - 如何在 Elasticsearch NEST 中序列化 JToken 或 JObject 类型的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50107494/

相关文章:

c# - 如何在 Azure Durable Function 中安全地生成 GUID?

c# - IDictionary<TKey, TValue> 的 LINQ?有没有我似乎找不到的 AddIf?

c# - 使用代码将日期分配给 TextBox textmode ="date"

c# - 不同的 "translated"JsonProperty 名称

c# - NullValueHandling.Ignore 使用 JsonConverter::WriteJson

c# - 将字符串列表附加到组合框

javascript - 如何在Node.js中的Elasticsearch中执行匹配查询?

elasticsearch - Elasticsearch 5.4传输客户端无法远程访问

Elasticsearch 分析器仅在我指定搜索字段时使用

c# - Json 属性作为节点生成