Tod*_*ier 4 c# json.net elasticsearch nest elasticsearch-net
我正在将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; }
}
Run Code Online (Sandbox Code Playgroud)
这允许用户发送像这样的JSON请求体,效果很好:
{
"Id": 123,
"Name": "Thing",
"ExtraProps": {
"Color": "red",
"Size": "large"
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我在NEST中将其用作文档类型,那些额外的属性会以某种方式丢失其值,序列化为:
{
"Id": 123,
"Name": "Thing",
"ExtraProps": {
"Color": [],
"Size": []
}
}
Run Code Online (Sandbox Code Playgroud)
添加[Nest.Object]属性ExtraProps不会改变行为.据我了解,NEST在内部使用Json.NET,所以我不希望它有Json.NET类型的问题.对此有一个相对简单的解决方案吗?
以下是我正在权衡的一些选项:
使用自定义序列化.我开始沿着这条路走下去,感觉比现在更加复杂,我从来没有让它发挥作用.
映射JObject到Dictionary<string, object>s.我已经验证了这个工作,但是如果有嵌套对象(可能存在),我需要通过递归来增强它.而且,理想情况下,我希望使用更通用的JToken类型.这是我倾向于的选择,但同样,它感觉比它应该更复杂.
使用"低级"客户端甚至原始HTTP调用.诚然,我没有探索过这个,但如果它比替代品更简单/更清洁,我会对它持开放态度.
将此报告为错误.无论如何,我可能会这样做.我只是预感到应该使用JObject或任何JToken开箱即用,除非有某种原因这是预期的行为.
这是NEST 6.x的预期行为.
NEST使用Json.NET进行序列化.然而,在NEST 6.x中,这种依赖性在NEST程序集内部被内化
internal有一篇博客文章,详细解释了这一变化背后的动机.
在处理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.JsonNetSerializerNuGet包是为了帮助与此有关.只需添加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);
Run Code Online (Sandbox Code Playgroud)
有了这个地方,带有JObject属性的文档将按预期序列化.
| 归档时间: |
|
| 查看次数: |
1015 次 |
| 最近记录: |