为了方便讨论,先甩出概念:
json 语言的基本概念:
属性名/属性值
即键值对(key-value)
数组
在 json 中是“[]”括起来的内容,数据结构为[“value1”,”value2”,…],取值方式和所有语言中一样,使用索引获取,属性值的类型可以是数字、字符串、数组、对象。
对象
在 json 中表示为“{}”括起来的内容,数据结构为 {key1:value1,key2:value2,…}的键值对的结构。在面向对象的语言中,key 为对象的属性,value 为对应的属性值,所以很容易理解,取值方法为对象.key 获取属性值,这个属性值的类型可以是数字、字符串、数组、对象几种。
- 对象中有属性值是数组的解析方式
eg:
{"_name":"稻香","byartist":["周杰伦","xxx"],"name":"稻香"}
解析还是照常,但是要把类定义为以下格式:
class music extends Object{
String _name;
List byartist;
String name;
}
JSON格式举例:
{"merged_res":{"semantic_form":{"appid":15361,"err_no":0,"parsed_text":"大声 一 点 ","raw_text":"大声一点","results":[]}}}
{"merged_res":{"semantic_form":{"appid":15361,"err_no":0,"parsed_text":"退出","raw_text":"退出","results":[{"domain":"instruction","intent":"quit","object":{},"score":0.950},{"domain":"vehicle_instruction","intent":"close","object":{"_equipment":"media_player","equipment":"media_player"},"score":0.950},{"domain":"air_conditioning","intent":"close","object":{},"score":0.950}]}}}
解析后的类:
代码:
public SemanticForm(String jsonStr){
// 需要全部的名字,故要加上"chatterbot.ycli12.com.myapplication."
Class domainClass;
this.setOrigalJson(jsonStr);
try{
JSONObject jsonObj = new JSONObject(jsonStr);
jsonStr = jsonObj.getString("merged_res");
jsonObj = new JSONObject(jsonStr);
jsonStr = jsonObj.getString("semantic_form");
jsonObj = new JSONObject(jsonStr);
this.appId = jsonObj.getInt("appid");
this.err_no = jsonObj.getInt("err_no");
this.parsed_text = jsonObj.getString("parsed_text");
this.raw_text = jsonObj.getString("raw_text");
//jsonArray中是一个个的jsonObject
JSONArray jsonArray;
jsonArray = jsonObj.getJSONArray("results");
if(jsonArray.length()>0) {
for (int i = 0; i < jsonArray.length(); i++) {
jsonObj = jsonArray.getJSONObject(i);
Result result = new Result();
result.intent = jsonObj.getString("intent");
result.score = jsonObj.getDouble("score");
result.domain = jsonObj.getString("domain");
try{
domainClass = Class.forName("com.baidu.chatter.Domain_" + result.domain);
result.domainObject = new Domain();
String obj_str = jsonObj.getString("object");
if(!obj_str.equals("{}")) {
Gson gson = new Gson();
result.domainObject = (Domain)gson.fromJson(obj_str, domainClass);
}
else {
result.domainObject = (Domain)domainClass.getConstructor().newInstance();
}
results.add(result);
} catch (Exception e) {
// Log.i(getClass().getName(),"未知对象类型,可能是定义的对象缺少必要的成员对象!!!");
// e.printStackTrace();
String strs[] = {"Domain_tv_instruction",};
if(!Arrays.asList(strs).contains("Domain_"+result.domain)) {
e.printStackTrace();
System.out.println(String.format("info: Class.forName找不到类:%s,要检查下这是否合适?", result.domain));
}
}
}
}
}
catch (JSONException e) {
e.printStackTrace();
}
}
解析多个数组:
[{"id":"Q1","Q":"what","A":"this"},{"id":"Q2","Q":"where","A":"there"}]
是多个数组,要用JSONArray
public class Scriptor {
private boolean parsed = false;
private Map QMap = new HashMap<>();
// 解析文件得到字典
public void Parse(String filename){
// [{"id":"Q1","Q":"what","A":"this"},{"id":"Q2","Q":"where","A":"there"}]
String txt = "[{\"id\":\"Q1\",\"Q\":\"what\",\"A\":\"this\"},{\"id\":\"Q2\",\"Q\":\"where\",\"A\":\"there\"}]";
try {
// 这一步是关键
JSONArray jsonArray = new JSONArray(txt);
JSONObject jsonObj;
for (int i = 0; i < jsonArray.length(); i++) {
jsonObj = jsonArray.getJSONObject(i);
QA QA = new QA(jsonObj.getString("Q"),jsonObj.getString("A"));
QMap.put(jsonObj.getString("id"),QA);
}
}catch (JSONException e) {
e.printStackTrace();
}
parsed = true;
}
// 获取问题和答案
public QA getQA(String idInStr){
if(!parsed)
throw new RuntimeException(String.format("没有先解析剧本文件"));
return QMap.get(idInStr);
}
}