1

Здравствуйте, делаю get запрос

    string k = "helo thera";
    var response = await client.PostAsync("http://speller.yandex.net/services/spellservice.json/checkText?text="+k+"&callback=fix_spell", content);

    var responseString = await response.Content.ReadAsStringAsync();

получаю json с нужной мне заменой,

fix_spell([{"code":1,"pos":0,"row":0,"col":0,"len":4,"word":"helo","s":["hello"]},{"code":1,"pos":5,"row":0,"col":5,"len":6,"word":"thera\u0435","s":["there"]}])

Как мне теперь поменять в переменной k:

helo на hello

thera на there?

VladD
  • 206,799
  • А вы справку по API читали? Что там говорится? – VladD Dec 09 '17 at 16:01
  • @VladD читал, но с json никогда не работал, по этому хз как сделать. Вот справка: https://tech.yandex.ru/speller/doc/dg/reference/checkText-docpage/ – Серега Гасюк Dec 09 '17 at 16:02
  • А зачем вам callback, если вы собираетесь разбирать JSON? – VladD Dec 09 '17 at 16:04
  • @VladD видел на сайте http://saippuakauppias.github.io/autocorrector/ , где это уже реализовано при нажатии на клавишу в запросе была эта функция – Серега Гасюк Dec 09 '17 at 16:09
  • @VladD суть в том что я хочу чтобы он отправило запрос и автоматом поменяло слова – Серега Гасюк Dec 09 '17 at 16:10
  • Ну вы когда копируете код, должны понимать, что конкретно вы делаете. Иначе толку не выйдет. – VladD Dec 09 '17 at 16:16
  • @VladD я не понимаю как просто поменять слова которые оно типа там заменило... – Серега Гасюк Dec 09 '17 at 16:17
  • Вы не понимаете, как в строке заменить часть по индексу? о_О – VladD Dec 09 '17 at 16:23

1 Answers1

1

Окей, для начала, вам нужно установить через nuget JSON.NET. (Имя пакета Newtonsoft.Json, устанавливать так.)

Затем, вам нужно определить класс, в который будет происходить десериализация. Исходя из описания API, вам приходит список таких классов:

class Error
{
    public int code, pos, row, col, len;
    public string word;
    public List<string> s;
}

Для разбора при помощи JSON.NET используйте

var errorList = JsonConvert.DeserializeObject<List<Error>>(responseString);

Затем, имея список, вы можете пройти его с конца (понятно, почему?), и заменять подстроки.

var sb = new StringBuilder(k);
foreach (var err in list.OrderByDescending(err => err.pos))
{
    sb.Remove(err.pos, err.len);
    sb.Insert(err.pos, err.s.First());
}
k = sb.ToString();

Да, вы отправляете строку неправильно, потому что вам пришёл результат не со строкой "thera", а со строкой "theraе" (последняя Е русская). Выясняйте сами, откуда она появилась.

VladD
  • 206,799
  • Круто, немного пошаманил под себя и вышло, спасибо! – Серега Гасюк Dec 09 '17 at 17:07
  • @СерегаГасюк: Пожалуйста! Рад, если помогло. – VladD Dec 09 '17 at 17:07
  • 1
    Может, какой каноничный ответ написать про парсинг json? А то такой вопрос задается уже не в первый раз, я примерно то же самое уже отвечал – tym32167 Dec 09 '17 at 18:51
  • @tym32167: Кстати да, хорошая идея, а то вопросы приходят регулярно. – VladD Dec 09 '17 at 18:52