JSON解析

为了方便讨论,先甩出概念:

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);
    }
}

你可能感兴趣的:(JSON解析)