java Json查询

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));
                }
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值