/// <summary>
        /// Create a completion suggestor with fuzzy functionality.
        /// </summary>
        /// <param name="suggestName">The name of the suggestor.</param>
        /// <param name="field">The field to find suggestions in.</param>
        /// <param name="fuzzy">The fuzzy completion values. A default value is acceptable.</param>
        public CompletionSuggester(string suggestName, string field, FuzzyCompletion fuzzy)
            : base(suggestName, field)
        {
            if (fuzzy == null)
                throw new ArgumentNullException("fuzzy", "CompletionSuggestor requires a fuzzy value in this constructor.");

            Fuzzy = fuzzy;
        }
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            Dictionary<string, object> wholeDict = serializer.Deserialize<Dictionary<string, object>>(reader);
            Dictionary<string, object> suggestDict = JsonConvert.DeserializeObject<Dictionary<string, object>>(wholeDict.First().Value.ToString());
            Dictionary<string, object> compDict = JsonConvert.DeserializeObject<Dictionary<string, object>>(suggestDict.GetString(SuggestTypeEnum.Completion.ToString()));

            FuzzyCompletion fuzzy = null;
            if (compDict.ContainsKey(_FUZZY))
            {
                Dictionary<string, object> fuzzyDict = null;
                try { fuzzyDict = JsonConvert.DeserializeObject<Dictionary<string, object>>(compDict.GetString(_FUZZY)); }
                catch { }

                if (fuzzyDict != null)
                {
                    fuzzy = new FuzzyCompletion();
                    if (fuzzyDict.ContainsKey(_FUZZINESS))
                        fuzzy.Fuzziness = fuzzyDict[_FUZZINESS];
                    else
                        fuzzy.Fuzziness = _FUZZINESS_DEFAULT;

                    fuzzy.IsUnicodeAware = fuzzyDict.GetBool(_IS_UNICODE_AWARE, _IS_UNICODE_AWARE_DEFAULT);
                    fuzzy.MinimumLength = fuzzyDict.GetInt32(_MINIMUM_LENGTH, _MINIMUM_LENGTH_DEFAULT);
                    fuzzy.PrefixLength = fuzzyDict.GetInt32(_PREFIX_LENGTH, _PREFIX_LENGTH_DEFAULT);
                    fuzzy.Transpositions = fuzzyDict.GetBool(_TRANSPOSITIONS, _TRANSPOSITIONS_DEFAULT);
                }
                else if(compDict.GetBool(_FUZZY))
                {
                    fuzzy = new FuzzyCompletion();
                }
            }

            CompletionSuggester suggestor = null;
            if(fuzzy == null)
                suggestor = new CompletionSuggester(wholeDict.First().Key, compDict.GetString(SuggestSerializer._FIELD));
            else
                suggestor = new CompletionSuggester(wholeDict.First().Key, compDict.GetString(SuggestSerializer._FIELD), fuzzy);
            suggestor.Size = compDict.GetInt32(SuggestSerializer._SIZE, SuggestSerializer._SIZE_DEFAULT);
            suggestor.Text = suggestDict.GetStringOrDefault(SuggestSerializer._TEXT);

            return suggestor;
        }