int NlsEvent::parseJsonMsg()

in nlsCppSdk/framework/common/nlsEvent.cpp [193:371]


int NlsEvent::parseJsonMsg(bool ignore) {
  if (_msg.empty()) {
    return -(NlsEventMsgEmpty);
  }

  try {
    Json::Reader reader;
    Json::Value head(Json::objectValue);
    Json::Value payload(Json::objectValue);
    Json::Value root(Json::objectValue);
    Json::Value stashResult(Json::objectValue);

    if (!reader.parse(_msg, root)) {
      LOG_ERROR("_msg:%s", _msg.c_str());
      return -(JsonParseFailed);
    }

    // parse head
    if (!root["header"].isNull() && root["header"].isObject()) {
      head = root["header"];
      // name
      if (!head["name"].isNull() && head["name"].isString()) {
        std::string name = head["name"].asCString();
        int retCode = parseMsgType(name);
        if (retCode < 0) {
          if (ignore == false) {
            if (retCode == -(InvalidNlsEventMsgType)) {
              LOG_ERROR("Event Msg Type is invalid: %s", _msg.c_str());
              return retCode;
            }
          }
        }
      }

      // status
      if (!head["status"].isNull() && head["status"].isInt()) {
        _statusCode = head["status"].asInt();
      } else {
        if (ignore == false) {
          return -(InvalidNlsEventMsgStatusCode);
        }
      }

      // task_id
      if (!head["task_id"].isNull() && head["task_id"].isString()) {
        _taskId = head["task_id"].asCString();
      }
    } else {
      if (!root["channelClosed"].isNull()) {
        _msgType = Close;
      } else if (!root["TaskFailed"].isNull()) {
        _msgType = TaskFailed;
      } else {
        if (ignore == false) {
          return -(InvalidNlsEventMsgHeader);
        }
      }
    }

    // parse payload
    if (_msgType != SynthesisCompleted && _msgType != MetaInfo) {
      if (!root["payload"].isNull() && root["payload"].isObject()) {
        payload = root["payload"];
        // result
        if (!payload["result"].isNull() && payload["result"].isString()) {
          _result = payload["result"].asCString();
        }

        // index
        if (!payload["index"].isNull() && payload["index"].isInt()) {
          _sentenceIndex = payload["index"].asInt();
        }

        // time
        if (!payload["time"].isNull() && payload["time"].isInt()) {
          _sentenceTime = payload["time"].asInt();
        }

        // begin_time
        if (!payload["begin_time"].isNull() && payload["begin_time"].isInt()) {
          _sentenceBeginTime = payload["begin_time"].asInt();
        }

        // confidence
        if (!payload["confidence"].isNull() &&
            payload["confidence"].isDouble()) {
          _sentenceConfidence = payload["confidence"].asDouble();
        }

        // display_text
        if (!payload["display_text"].isNull() &&
            payload["display_text"].isString()) {
          _displayText = payload["display_text"].asCString();
        }

        // spoken_text
        if (!payload["spoken_text"].isNull() &&
            payload["spoken_text"].isString()) {
          _spokenText = payload["spoken_text"].asCString();
        }

        // sentence timeOut status
        if (!payload["status"].isNull() && payload["status"].isInt()) {
          _sentenceTimeOutStatus = payload["status"].asInt();
        }

        // example: "words":[{"text":"一二三四","startTime":810,"endTime":2460}]
        if (!payload["words"].isNull() && payload["words"].isArray()) {
          Json::Value wordArray = payload["words"];
          int iSize = wordArray.size();
          WordInfomation wordInfo;

          for (int nIndex = 0; nIndex < iSize; nIndex++) {
            if (wordArray[nIndex].isMember("text") &&
                wordArray[nIndex]["text"].isString()) {
              wordInfo.text = wordArray[nIndex]["text"].asCString();
            }
            if (wordArray[nIndex].isMember("startTime") &&
                wordArray[nIndex]["startTime"].isInt()) {
              wordInfo.startTime = wordArray[nIndex]["startTime"].asInt();
            }
            if (wordArray[nIndex].isMember("endTime") &&
                wordArray[nIndex]["endTime"].isInt()) {
              wordInfo.endTime = wordArray[nIndex]["endTime"].asInt();
            }
            // LOG_DEBUG("List Push: %s %d %d",
            //     wordInfo.text.c_str(), wordInfo.startTime, wordInfo.endTime);

            _sentenceWordsList.push_back(wordInfo);
          }  // for
        }

        // WakeWordVerificationCompleted
        if (_msgType == NlsEvent::WakeWordVerificationCompleted) {
          if (!payload["accepted"].isNull() && payload["accepted"].isBool()) {
            _wakeWordAccepted = payload["accepted"].asBool();
          }
          if (!payload["known"].isNull() && payload["known"].isBool()) {
            _wakeWordKnown = payload["known"].asBool();
          }
          if (!payload["user_id"].isNull() && payload["user_id"].isString()) {
            _wakeWordUserId = payload["user_id"].asCString();
          }
          if (!payload["gender"].isNull() && payload["gender"].isInt()) {
            _wakeWordGender = payload["gender"].asInt();
          }
        }

        // stashResult
        if (_msgType == NlsEvent::SentenceEnd) {
          if (!payload["stash_result"].isNull() &&
              payload["stash_result"].isObject()) {
            stashResult = payload["stash_result"];
            if (!stashResult["sentenceId"].isNull() &&
                stashResult["sentenceId"].isInt()) {
              _stashResultSentenceId = stashResult["sentenceId"].asInt();
            }
            if (!stashResult["beginTime"].isNull() &&
                stashResult["beginTime"].isInt()) {
              _stashResultBeginTime = stashResult["beginTime"].asInt();
            }
            if (!stashResult["currentTime"].isNull() &&
                stashResult["currentTime"].isInt()) {
              _stashResultCurrentTime = stashResult["currentTime"].asInt();
            }
            if (!stashResult["text"].isNull() &&
                stashResult["text"].isString()) {
              _stashResultText = stashResult["text"].asCString();
            }
          }
        }
      }
    }
  } catch (const std::exception& e) {
    LOG_ERROR("Json failed: %s", e.what());
    return -(JsonParseFailed);
  }
  return Success;
}