当前位置: 首页 > 工具软件 > JSONQuery > 使用案例 >

java Json查询

金旺
2023-12-01
package test;
//json是一个递归数据结构,因此可以使用函数的递归调用来进行解析。
//每一类数据对应一个解析函数,代码中parseString实现解析字符串的功能,parseObject实现解析对象的功能。
//解析函数的主体功能就是依次遍历每一个字符,根据字符判断是否是字符串的开始、对象的开始……并进行相应的处理。
//json是一个键值对的结构,因此可以用map存储。map的键可以用查询的格式,用小数点.来分隔多层的键。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Scanner;
class NUN{
    int i = 0;
}
public class Main {
    static public String parseString(String str, NUN i) {
        // String tmp="";//tmp为字符串里面的内容
        StringBuffer sb = new StringBuffer();
        if (str.charAt(i.i) == '"')
            i.i++;// 将移动到字符串的起始位置
        while (i.i < str.length()) {
            if (str.charAt(i.i) == '\\') {// 截取\后面的字符 单个字符为单引号
                i.i++;
                // tmp += str.charAt(i);
                sb.append(str.charAt(i.i));
                i.i++;
            } else if (str.charAt(i.i) == '"') {// 已经截取到末尾
                i.i++;//移出字符串
                break;
            } else {
                sb.append(str.charAt(i.i));
                // tmp += str.charAt(i);
                i.i++;
            }
        }
//      if (str.charAt(i.i) == '"')
//          i.i++; // 移出字符串
        return sb.toString();
    } 

    static public void parseObject(String str, String prefix, Map<String, String> dict, NUN i) {
        if (str.charAt(i.i) == '{')
            i.i++;// prefix为前缀
        String key = "";
        String value;// 分别用于存储key和value
        Boolean strType = false;// false:key, true:value,用于标识key和value
        while (i.i < str.length()) {
            if (str.charAt(i.i) == '"') {// 说明此处为key或value
                String tmp = parseString(str, i);
                if (strType) {// value
                    value = tmp;
                    dict.put(key, value);
                } else {// key
                    key = prefix + (prefix == "" ? "" : ".") + tmp;// 如果prefix不为空说明有嵌套,用.进行分隔
                }
            } else if (str.charAt(i.i) == ':') {// 后面一定为value
                strType = true;
                i.i++;
            } else if (str.charAt(i.i) == ',') {// 后面一定为key
                strType = false;
                i.i++;
            } else if (str.charAt(i.i) == '{') {// 表示内部有嵌套对象
                dict.put(key, "");// 对象的值为空
                parseObject(str, key, dict, i);
            } else if (str.charAt(i.i) == '}') {// 用于跳出内部的嵌套对象
                i.i++;
                break;
            } else {
                i.i++;//遇到空格就跳过
            }
        }
//      if (str.charAt(i.i) == '}') {// 将整个json字符串遍历完毕
//          i.i++;
//      }
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int N = in.nextInt();
        int M = in.nextInt();
        String json = new String();
        in.nextLine();//将in.nextInt接收传递的回车过滤掉
        for (int n = 0; n < N; n++) {
            String tmp;
            tmp = in.nextLine();
            json += tmp;//可以忽略回车,将所有的字符连接一个字符串
        }
        Map<String, String> dict = new HashMap<String, String>();
        NUN i = new NUN();
        parseObject(json, "", dict, i);
        String query;
        for (int m = 0; m < M; m++) {
            query = in.nextLine();
            if (!dict.containsKey(query)) {
                System.out.println("NOTEXIST");
            } else {
                if (dict.get(query).equals("")) {
                    System.out.println("OBJECT");
                } else {
                    System.out.println("STRING " + dict.get(query));
                }
            }
        }
    }
}
 类似资料: