繁体   English   中英

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

[英]How do I serialize properties of type JToken or JObject in Elasticsearch NEST?

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

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. 使用自定义序列化 我开始沿着这条路走下去,感觉比现在更复杂,我从来没有让它发挥作用。

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

  3. 使用“低级”客户端甚至原始HTTP调用。 诚然,我没有探索过这个,但如果它比替代品更简单/更清洁,我会对它持开放态度。

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

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

NEST使用Json.NET进行序列化。 然而,在NEST 6.x中,这种依赖性在NEST程序集内部被内化

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

有一篇博客文章,详细解释了这一变化背后的动机。

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

要支持Json.NET类型,需要连接使用Json.NET来序列化文档的序列化程序。 创建NEST.JsonNetSerializer nuget包是为了帮助解决这个问题。 只需在项目中添加对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属性的文档JObject预期序列化。

暂无
暂无

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

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