package utils;
import org.json.JSONArray;
import org.json.JSONObject;
import org.json.JSONTokener;
import android.text.TextUtils;
//import com.iflytek.speech.ErrorCode;
//import com.iflytek.speech.SpeechError;
/**
* 对云端返回的Json结果进行解析
* @author iFlytek
* @since 20131211
*/
public class JsonParser {
/**
* 听写结果的Json格式解析
* @param json
* @return
*/
public static String parseIatResult(String json) {
if(TextUtils.isEmpty(json))
return "";
StringBuffer ret = new StringBuffer();
try {
JSONTokener tokener = new JSONTokener(json);
JSONObject joResult = new JSONObject(tokener);
JSONArray words = joResult.getJSONArray("ws");
for (int i = 0; i < words.length(); i++) {
// 听写结果词,默认使用第一个结果
JSONArray items = words.getJSONObject(i).getJSONArray("cw");
JSONObject obj = items.getJSONObject(0);
ret.append(obj.getString("w"));
// 如果需要多候选结果,解析数组其他字段
// for(int j = 0; j < items.length(); j++)
// {
// JSONObject obj = items.getJSONObject(j);
// ret.append(obj.getString("w"));
// }
}
} catch (Exception e) {
e.printStackTrace();
}
return ret.toString();
}
/**
* 识别结果的Json格式解析
* @param json
* @return
*/
public static String parseGrammarResult(String json) {
StringBuffer ret = new StringBuffer();
try {
JSONTokener tokener = new JSONTokener(json);
JSONObject joResult = new JSONObject(tokener);
JSONArray words = joResult.getJSONArray("ws");
for (int i = 0; i < words.length(); i++) {
JSONArray items = words.getJSONObject(i).getJSONArray("cw");
for(int j = 0; j < items.length(); j++)
{
JSONObject obj = items.getJSONObject(j);
if(obj.getString("w").contains("nomatch"))
{
ret.append("没有匹配结果.");
return ret.toString();
}
ret.append("【结果】" + obj.getString("w"));
ret.append("【置信度】" + obj.getInt("sc"));
ret.append("\n");
}
}
} catch (Exception e) {
e.printStackTrace();
ret.append("没有匹配结果.");
}
return ret.toString();
}
/**
* 语义结果的Json格式解析
* @param json
* @return
*/
public static String parseUnderstandResult(String json) {
StringBuffer ret = new StringBuffer();
try {
JSONTokener tokener = new JSONTokener(json);
JSONObject joResult = new JSONObject(tokener);
ret.append("【应答码】" + joResult.getString("rc") + "\n");
ret.append("【转写结果】" + joResult.getString("text") + "\n");
ret.append("【服务名称】" + joResult.getString("service") + "\n");
ret.append("【操作名称】" + joResult.getString("operation") + "\n");
ret.append("【完整结果】" + json);
} catch (Exception e) {
e.printStackTrace();
ret.append("没有匹配结果.");
}
return ret.toString();
}
}
这段代码定义了一个名为 JsonParser
的实用工具类,
它提供了几个静态方法用于解析特定格式的 JSON 数据。
这些方法主要用于解析
从云端返回的 JSON 结果,
涉及听写结果
、识别结果
和语义结果
的解析。
-
听写结果解析 (
parseIatResult
方法):- 输入:一个 JSON 格式的字符串,包含听写结果。
- 输出:听写结果的文本内容。
- 功能:解析 JSON 字符串中的
"ws"
数组,提取每个单词的第一个候选词作为最终的听写结果。
-
识别结果解析 (
parseGrammarResult
方法):- 输入:一个 JSON 格式的字符串,包含识别结果。
- 输出:包含识别结果的文本内容及置信度。
- 功能:解析 JSON 字符串中的
"ws"
数组,提取每个单词的所有候选词,并包含置信度 (sc
),如果识别结果包含 “nomatch” 则返回没有匹配结果的信息。
-
语义结果解析 (
parseUnderstandResult
方法):- 输入:一个 JSON 格式的字符串,包含语义分析的结果。
- 输出:包含应答码、转写结果、服务名称、操作名称以及原始 JSON 数据的文本信息。
- 功能:解析 JSON 字符串中的关键字段,如
"rc"
(应答码)、"text"
(转写结果)、"service"
(服务名称) 和"operation"
(操作名称),并将这些信息整理成易于阅读的格式。