2015-11-19 3 views
0

Я реализую простую поисковую систему. Все данные сохранены как JSON в текстовом файле. Мой сценарий реализации: если я ищу слово, например, метод «rock», должен возвращать результат в виде списка тегов Id, содержащих значение «rock». Я искал примеры кодов, но в каждом exseample они ищут по тегу, например track_id », но мне нужен поиск . по значению Это мой пример JSON массив ..Поиск текста в массиве JSON в C#

enter image description here

Тест слово: рок ожидаемый результат: 991335,991336,991337

ответ

1

Я предлагаю использовать библиотеку JSON, как Json.NET .

Если вы можете позволить прочитать все файл, его супер-легкий с linq.

class TrackElement { 
    public Track Track {get;set;} 
} 
class Track { 
    public string track_id{get;set;} 
    public string track_name{get;set;} 
    public string track_category{get;set;} 
} 

чтение файл, Deserialize и поиск:

var data = File.ReadAlltext("path/to/your/file.txt"); 
List<TrackElement> database = JsonConvert.DeserializeObject<List<TrackElement>>(data); 

var results = database.Where(i=>i.Track.track_category.ToLower().Contains("rock")).Select(t=>t.Track.track_id); 

Если база данных является реальной большой, вы не должны прочитать весь материал в память, в этом случае вы можете использовать потоковый разбор (лексема-на -token), непосредственно просматривая файл. Для этого вы можете использовать класс JsonReader из Json.net lib. (http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_JsonReader.htm)

+0

Thanx для быстрого ответа и вашего ответа правильно, но его трудно настроить для моего сценария. Потому что вы использовали поиск только в теге track_category. var results = database.Where (i => i.Track.track_category.ToLower(). Содержит («рок»)). Выберите (t => t.Track.track_id); но в моем случае я не могу определить какой-либо фиксированный тег. «Rock» можно сохранить как название дорожки, название трека или имя исполнителя. Мне нужен список идентификаторов возвратного трека, которые содержат «Rock» в любом теге. –

+0

Тогда единственный способ решить - использовать более сложное выражение поиска, например: var results = database.Where (i => i.Track.track_category.ToLower(). Содержит («rock») || i.Track.track_id.ToLower(). Содержит («rock») || i.Track.track_name.ToLower(). Содержит («рок») ). Выберите (t => t.Track.track_id); Вы можете сделать его более понятным, если вы напишите вспомогательный метод для выражения поиска. –

Смежные вопросы