Продолжим цикл статей про работу с блокчейном голоса. За это время код был приведён в человеческий вид. Начнём.
Рефакторинг кода.
Наша цель - получить номер блока и получить данные из него данные типа "comment". Поэтому первый код перевёл в метод getNumberBlock и getContent.
И перепишем метод onMessage, принимающий аргумент - входную json строку от сервера.
Первым делом строку преобразуем в JSON объект.
Не забываем про try/catch.
try{
JSONObject data = new JSONObject(text);
}catch(JSONException e){
e.printStackTrace();
}
Далее, как помним, а если не помним, то освежаем память, нам надо проверить метод, он должен равняться notice или id запроса, и должен равняться 2.
Делаем проверку на наличие занчений в полученом JSON Объекте.
if (data.has("id")){
}else if(data.has("method")){
}
Первое условие проверяет есть ли ключ id если нет, то проверяем ключ method.
Если есть ключ id, то получаем его и проверяем чему он равняется.
int idRequest = data.getInt("id");
if(idRequest == 2) {
this.getContent(data);
}
Всё просто, получаем "id" и сверяем его с "двойкой", если условие удовлетворяет, то передаём объект нашему методу getContent. Его опишем ниже.
Далее работаем с method. Если метод есть в блоке, то проверяем, чему он равен. А потом отправим его обратно в наш блокчеен, чтобы уже получить его данные.
String method = data.getString("method");
if(Objects.equals(method, "notice")){
int hex = this.getNumberBlock(text);
try {
JSONObject blockSet = new JSONObject("{id:2, method: 'call', 'params':['database_api', 'get_ops_in_block', [" + hex + ",'false']]}");
webSocket.send(blockSet.toString());
} catch (JSONException ee) {
ee.toString();
}
Отмечу, что сравнение строк производил методом equals, о нем почитать тут.
Получаем сначала значение ключа method. Если оно равно notice, то идём дальше.
Отправляем в наш метод getNumberBlock JSON строку из которой мы получим номер блока. Опишем её ниже.
Получив номер блока, мы создаём JSON объект, передав туда номер блока и отправляем его в блокчейн.
getNumberBlock
Метод служит для получения номера блока. Мы его рассматривали в прошлой статье. В целом тут ничего не поменялось. Только отметим, что метод возвращает число(int). Полный код метода, можно посмотреть в листинге.
getContent
Весь функционал метода сводится к тому, что бы получить массив из JSON объекта и наоборот. Очень выручил сервис jsoneditoronline.org.
В этот метод мы получаем JSONobject и первым делом получаем массив result.
JSONArray result = data.getJSONArray("result");
Он хранит в себе объекты JSON. Чтобы получить их значения "прогуляемся" циклом.
for(int i = 0; result.length() >= i; i++){
}
В цикле, по ключу i, получим объекты
JSONObject resJson = result.getJSONObject(i);
В этих объектах имеется массив op
JSONArray resParam = resJson.getJSONArray("op");
хранящий в себе тип блока и его данные. Первым делом получим тип блока
String typeBlock = resParam.getString(0);
Нулевой индекс(0) потому что он первый в массиве.
И проверим равен ли он "comment".
if(Objects.equals(typeBlock, "comment")){
}
Внутри условия получим, например parent_author, по нему в дальнейшем определим статья это или комментарий.
JSONObject dataBlock = resParam.getJSONObject(1);
String parent_author = dataBlock.getString("parent_author");
Как видим, нам уже понадобился первый индекс-второй объект массива, в котором имеется ключ "parent_author".
Так, относительно просто, мы получили данные с блокчейна. Главное быть предельно внимательным. Спасибо за внимание!
Полный листинг
Материал подготовлен автором @zheev
Ваш пост поддержали следующие Инвесторы Сообщества "Добрый кит":
alex2016, gildar, max-max, phoenix, galina1, tristamoff, vadbars, olga-olga, semasping, arystarch, vika-teplo, edsaw, amelina.elena, del137, kertar, ifingramota, oksi-m, zhenek, magformers, kr-alexey, rastabandito
Поэтому я тоже проголосовал за него!
Узнать подробности о сообществе можно тут:
Разрешите представиться - Кит Добрый
Правила
Инструкция по внесению Инвестиционного взноса
Вы тоже можете стать Инвестором и поддержать проект!!!
Если Вы хотите отказаться от поддержки Доброго Кита, то ответьте на этот комментарий командой "!нехочу"
dobryj.kit теперь стал Делегатом! Ваш голос важен для всего сообщества!!!
Поддержите нас:
@vik 100%
@vik 100%