public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            IEnumerable<Dictionary<string, object>> queries = null;
            if (reader.TokenType == JsonToken.StartArray)
            {
                queries = serializer.Deserialize<IEnumerable<Dictionary<string, object>>>(reader);
            }
            else
            {
                queries = new List<Dictionary<string, object>>()
                {
                    serializer.Deserialize<Dictionary<string, object>>(reader)
                };
            }

            List<RescoreQuery> rescoreQueries = new List<RescoreQuery>();
            foreach (Dictionary<string, object> rescoreDict in queries)
            {
                Dictionary<string, object> queryDict = JsonConvert.DeserializeObject<Dictionary<string, object>>(rescoreDict.GetString(_QUERY));
                RescoreQuery rescoreQuery = new RescoreQuery(JsonConvert.DeserializeObject<IQuery>(queryDict.GetString(_RESCORE_QUERY)));

                rescoreQuery.QueryWeight = queryDict.GetDouble(_QUERY_WEIGHT, _QUERY_WEIGHT_DEFAULT);
                rescoreQuery.RescoreQueryWeight = queryDict.GetDouble(_RESCORE_QUERY_WEIGHT, _RESCORE_QUERY_WEIGHT_DEFAULT);
                rescoreQuery.ScoreMode = ScoreModeEnum.Find(queryDict.GetString(_SCORE_MODE, _SCORE_MODE_DEFAULT.ToString()));
                rescoreQuery.WindowSize = rescoreDict.GetInt32OrNull(_WINDOW_SIZE);

                rescoreQueries.Add(rescoreQuery);
            }

            return new Rescore(rescoreQueries);
        }
        private Dictionary<string, object> SerializeRescore(RescoreQuery rescoreQuery)
        {
            Dictionary<string, object> queryDict = new Dictionary<string, object>();
            queryDict.AddObject(_SCORE_MODE, rescoreQuery.ScoreMode.ToString(), _SCORE_MODE_DEFAULT.ToString());
            queryDict.Add(_RESCORE_QUERY, rescoreQuery.Query);
            queryDict.AddObject(_QUERY_WEIGHT, rescoreQuery.QueryWeight, _QUERY_WEIGHT_DEFAULT);
            queryDict.AddObject(_RESCORE_QUERY_WEIGHT, rescoreQuery.RescoreQueryWeight, _RESCORE_QUERY_WEIGHT_DEFAULT);

            Dictionary<string, object> rescoreDict = new Dictionary<string, object>();
            rescoreDict.AddObject(_WINDOW_SIZE, rescoreQuery.WindowSize);
            rescoreDict.Add(_QUERY, queryDict);

            return rescoreDict;
        }