我引用了包含TypeConverter属性的外部库中定义的几个类。由于此属性,Json.Net以及因此Nest错误地序列化了这些对象。序列化这些对象的正确方法是忽略TypeConverter属性并使用对象属性。在搜索Stack Overflow时,我发现了一种成功执行this的方法。
不幸的是,当我以下列方式将此方法应用于Nest时,结果对象不包含必要的_type,_index和_id字段。
var settings = new ConnectionSettings(_Uri);
// Tell Json.Net to ignore custom TypeConverters
settings.SetJsonSerializerSettingsModifier(m => m.ContractResolver = new SerializableContractResolver());
var client = new ElasticClient(settings);
由于生成的JSON不包含关键字段,因此所有索引请求都会失败。有没有办法让Nest忽略TypeConverter属性,同时仍然确保对象包含Elasticsearch请求的必要附加字段?
答案 0 :(得分:2)
当你通过忽略TypeConverters的契约修正者时,你在我看来应用火箭筒来杀死苍蝇。
我们也非常依赖于类型转换器来正确编写我们的对象。
如果外部库中的类不能完全代表它们在弹性搜索索引中的显示方式,我建议为NEST创建一个特定的POCO
。 AutoMapper是将外部库的实例转换为可索引对象实例的好方法。
答案 1 :(得分:0)
我继续使用定义的方法here。然后我正确地将外部对象序列化为JSON。我将对象反序列化为动态类型。最后,我将此对象传递给Nest。
// Strip away TypeConverter attributes -- super hacky
var json = JsonConvert.SerializeObject(item);
payload = JsonConvert.DeserializeObject<dynamic>(json);
descriptor.Index<Object>(op => op.Index(index).Type(type).Id(id).Document(payload));