Сортировка объекта JSON с использованием Linq - PullRequest
2 голосов
/ 30 июля 2010

Я получаю ответ от службы предложения Google Search Appliance в форме JSON в следующем формате

string jsonString = @"{ ""query"": ""t"", ""results"": [ { ""name"": ""tom"", ""type"": ""suggest"" }, { ""name"": ""tim"", ""type"": ""suggest"" }]}";

Я хочу отсортировать список результатов по алфавиту по названию и изменить имена на регистр предложений. Я могу сделать это в jquery, но предпочел бы делать это на стороне сервера по соображениям производительности.

Я могу отсортировать результаты, но это возвращает IEnumarable<Result>, но я не могу отсортировать результаты внутри сериализуемого объекта.

 string jsonString = @"{ ""query"": ""t"", ""results"": [ { ""name"": ""tom"", ""type"": ""suggest"" }, { ""name"": ""tim"", ""type"": ""suggest"" }]}";

JObject json = JObject.Parse(jsonString);

        var gsaSuggestions = JsonConvert.DeserializeObject<GSASuggestion>(jsonString);

        var orded = gsaSuggestions.ResultList.OrderBy<Result, string>(r => r.Name);

        string output = JsonConvert.SerializeObject(gsaSuggestions);
    }

    [JsonObject(MemberSerialization.OptOut)]
    public class GSASuggestion
    {
        [JsonProperty(PropertyName = "query")]
        public string Query {get; set;}
        [JsonProperty(PropertyName = "results")]
        public List<Result> ResultList {get; set;}
    }

    public class Result
    {
        [JsonProperty(PropertyName = "name")]
        public string Name {get; set;}
        [JsonProperty(PropertyName = "type")]
        public string Type {get; set;}
    }

результат должен быть:

{ "query": "t", "results": [ { "name": "Tim", "type": "suggest" }, { "name": "Tom", "type": "suggest" }]};

1 Ответ

8 голосов
/ 30 июля 2010

Вы на самом деле не используете возвращаемое значение OrderBy. Попробуйте:

gsaSuggestions.ResultList =
    gsaSuggestions.ResultList.OrderBy<Result, string>(r => r.Name).ToList();

Помните, OrderBy возвращает новую последовательность с результатами по порядку и не изменяет исходную последовательность. Если вы хотите, чтобы gsaSuggestions.ResultList был отсортирован, вам нужно назначить ему отсортированный список.

Вы также можете выполнить сортировку на месте, используя List.Sort :

gsaSuggestions.ResultList.Sort((x, y) => x.Name.CompareTo(y.Name));
...