忽略Elasticsearch Nest中的TypeConverter属性

时间:2015-01-30 03:55:22

标签: c# elasticsearch json.net nest

我引用了包含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请求的必要附加字段?

2 个答案:

答案 0 :(得分:2)

当你通过忽略TypeConverters的契约修正者时,你在我看来应用火箭筒来杀死苍蝇。

我们也非常依赖于类型转换器来正确编写我们的对象。

如果外部库中的类不能完全代表它们在弹性搜索索引中的显示方式,我建议为NEST创建一个特定的POCOAutoMapper是将外部库的实例转换为可索引对象实例的好方法。

答案 1 :(得分:0)

@Martijn Laarman的建议可能是正确的解决方案。但是,我决定用以下黑客解锁自己:

我继续使用定义的方法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));