2014-02-12 54 views
0

我已經索引定義爲這樣一個目標:如何實現NEST使用的NodaTime JSON轉換器?

public class CourseOffering 
{ 
    public int CourseId { get; set; } 
    public string Title { get; set; } 
    public DateTime StartDate { get; set; } 
    public DateTime EndDate { get; set; } 
    public ICollection<TimeBlock> TimeBlocks { get; set; } 
} 

的TimeBlock類定義爲:

public class TimeBlock 
{ 
    public DayOfWeek Day { get; set; } 
    public LocalTime StartTime { get; set; } 
    public LocalTime EndTime { get; set; } 
} 

當調用動態搜索方法,一切工作正常(大概是因爲它不知道什麼要反序列化)。結果正確返回。

當調用通用搜索方法並傳入CourseOffering類型時,默認序列化程序在反序列化LocalTime對象時出現問題。我得到以下JsonReaderException:

讀取整數時出錯。意外的令牌:StartObject。路徑 'hits.hits [0] ._ source.timeBlocks [0] .startTime',第1行,位置655

我曾嘗試添加LocalTimeConverter像這樣:

var settings = new ConnectionSettings(uri); 
settings.SetDefaultIndex(index); 
settings.AddContractJsonConverters(t => typeof (LocalTime).IsAssignableFrom(t) ? NodaConverters.LocalTimeConverter : null); 

但是它導致此JsonReaderException:

無法將字符串轉換爲整數:12:30:00。路徑'hits.hits [0] ._ source.timeBlocks [0] .startTime',第1行,位置664.

我真的不能告訴我是否做錯了什麼或者是否有問題。任何援助將不勝感激。

+0

它看起來像你正在嘗試使用Json.NET轉換器 - 但實際上是期待'DataContractJsonSerializer'的方法嗎? –

回答

0

今天我學到了一個新課程:始終將您的代碼放在Stack Overflow上,就像它出現在您的問題中一樣。爲了簡化我遇到的問題,我忽略了序列化/反序列化對象的一個​​非常明顯的問題:我的TimeBlock類沒有公共無參數構造函數。

爲了清楚起見,這是我的實際TimeBlock類:

public class TimeBlock 
{ 
    public DayOfWeek Day { get; set; } 
    public LocalTime StartTime { get; set; } 
    public LocalTime EndTime { get; set; } 

    public TimeBlock(int day, int startTime, int endTime) 
    { 
     Day = (DayOfWeek)day; 
     StartTime = new LocalTime(startTime/100, startTime % 100); 
     EndTime = new LocalTime(endTime/100, endTime % 100); 
    } 

    public string GetDayOfWeekString() 
    { 
     return CultureInfo.CurrentCulture.DateTimeFormat.GetDayName(Day); 
    } 
} 

添加在當地構造使一切桃色的。

public TimeBlock() {} 
0

使用NEST 5.5.0/2.2.2 Nodatime,我遇到過類似的錯誤,但必須使用以下方法來使Nodatime的JSON轉換器:

var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200")); 
var settings = new ConnectionSettings(pool, new HttpConnection(), new SerializerFactory((s, v) => s.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb)));