使用NEST索引JObject时属性值为空数组[]的问题
解决NEST索引JObject时字段值变为空数组的问题
我之前也碰到过一模一样的坑,问题根源出在NEST处理JObject泛型索引的逻辑上。当你用Index<JObject>时,NEST会把JObject当成强类型对象去序列化,但JObject的内部结构是基于JToken的,NEST默认序列化器没法正确解析这些JToken对应的实际值,最后就把所有字段都转成了空数组[]。而Postman是直接把原始JSON发给Elasticsearch,绕开了NEST的这个序列化问题,所以结果完全正常。
给你三个可行的解决方案:
方案1:改用非泛型的Index方法
去掉泛型参数<JObject>,直接传入JObject实例,让NEST正确处理原始JSON的序列化逻辑:
string indexName = "testindex"; IIndexResponse response = client.Index(docItem, i => i.Type("my_type").Index(indexName));
方案2:直接索引JSON字符串
把JObject转换成纯JSON字符串,用IndexRaw方法直接发送原始内容:
string json = docItem.ToString(Formatting.None); IIndexResponse response = client.IndexRaw(json, i => i.Type("my_type").Index(indexName));
方案3:配置NEST使用Newtonsoft.Json序列化器
如果必须保留泛型写法,可以在创建ElasticClient时指定使用JsonNetSerializer,它能完美解析JObject的结构:
var settings = new ConnectionSettings(new Uri("http://[IP]:9200")) .DefaultIndex("testindex") .Serializer(new JsonNetSerializer()); var client = new ElasticClient(settings);
用任意一种方法修改后,重新索引文档,再执行搜索请求,就能看到_source里的字段值都正常显示了,比如:
"_source": { "Source":"test", "CreatedAt": "2018-05-26 12:23:33", "SessionId":"1234", "ResponseParam":{ "ItemA":"bla", "ItemB": 123 } }
内容的提问来源于stack exchange,提问作者BvdVen
相关产品推荐
相关产品推荐

