ccf csp JSON查询

import java.util.LinkedHashMap;
import java.util.Scanner;

public class Main {
    private Scanner input = new Scanner(System.in);
    private LinkedHashMap<String,String> dict = new LinkedHashMap<>();
    public static void main(String[] args) {
        new Main().run();
    }

    private void run() {
        int n = input.nextInt();
        int m = input.nextInt();
        input.nextLine();
        StringBuffer sb = new StringBuffer();
        String str = "";
        for (int i = 0; i < n; i++) {
            sb.append(input.nextLine());
        }
        str = sb.toString();
        dealwithjson(str);
//        for (String s : dict.keySet()) {
//            System.out.println(s+" "+dict.get(s));
//        }
        String ask;
        for (int i = 0; i < m; i++) {
            ask = input.nextLine();
            ask = dict.get(ask);
            if (ask==null){
                System.out.println("NOTEXIST");
            }else if (ask.equals("fuckccf")){
                System.out.println("OBJECT");
            }else {
                System.out.println("STRING"+" "+ask);
            }
        }
    }

    private void dealwithjson(String str) {
        // 先扒皮,扒掉第一个和最后一个{}
        int lbrace = str.indexOf("{");
        int rbrace = str.lastIndexOf("}");
        str = str.substring(lbrace + 1, rbrace).trim();
//        System.out.println(str);
        Node node = new Node("",str);
        String key;
        String val;
        if (node.remain.equals("")){
            return;
        }
        while (true){
            //获取key
            node = gettoken(node.remain);
            key = node.token;
            //获取:
            str = node.remain;
            node = gettoken(str);
            //获取value
            node = gettoken(node.remain);
            val = node.token;
            if (node.isobj){
                dict.put(key,"fuckccf");
                dealsomejson(key,val);
            }else {
                dict.put(key,val);
            }
            //获取,
            node = gettoken(node.remain);
            if (node == null){
                break;
            }
        }
    }

    private void dealsomejson(String subkey, String str) {
        // 先扒皮,扒掉第一个和最后一个{}
        int lbrace = str.indexOf("{");
        int rbrace = str.lastIndexOf("}");
        str = str.substring(lbrace + 1, rbrace).trim();
        Node node = new Node("",str);
        String key;
        String val;
        if (node.remain.equals("")){
            return;
        }
        while (true){
            //获取key
            node = gettoken(node.remain);
            key = node.token;
            //获取:
            str = node.remain;
            node = gettoken(str);
            //获取value
            node = gettoken(node.remain);
            val = node.token;
            if (node.isobj){
                dict.put(subkey+"."+key,"fuckccf");
                dealsomejson(subkey+"."+key,val);
            }else {
                dict.put(subkey+"."+key,val);
            }
            //获取,
            node = gettoken(node.remain);
            if (node == null){
                break;
            }
        }
    }


    private Node gettoken(String str) {
        if (str.equals(""))
            return null;
        char c = str.charAt(0);
        switch (c){
            case ',':
            case ':':
                return new Node(c+"",str.substring(1).trim());
            case '{':
                int rbrace = getrbrace(str);
                return new Node(str.substring(0,rbrace+1),str.substring(rbrace+1).trim(),true);
            case '\"':
                StringBuilder sb = new StringBuilder();
                int falg = 1;
                int i;
                for (i = 1; i < str.length(); i++) {
                    if (str.charAt(i)=='\\'&&falg==1){
                        falg = 2;
                        continue;
                    }
                    if (str.charAt(i)=='\"'&&falg==1){
                        break;
                    }
                    if (falg == 2){
                        falg = 1;
                    }
                    sb.append(str.charAt(i));
                }
                return new Node(sb.toString(),str.substring(i+1).trim());
        }
        return null;
    }

    private int getrbrace(String str) {
        boolean instr = false;
        int rbrace = 0;
        int index = 0;
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == '{'&&!instr){
                rbrace++;
            }
            if (str.charAt(i) == '}'&&!instr){
                rbrace--;
            }
            if (rbrace==0){
                index = i;
                break;
            }
            if (str.charAt(i) == '\"'){
                i++;
                while (true){
                    if (str.charAt(i)=='\\'){
                        i+=2;
                    }else {
                        i++;
                    }
                    if (str.charAt(i)=='\"'){
                        break;
                    }
                }
            }
        }
        return index;
    }

    class Node{
        boolean isobj;
        String token;
        String remain;
        public Node(String token,String remain){
            this.token = token;
            this.remain = remain;
            isobj = false;
        }
        public Node(String token,String remain,boolean isobj){
            this.token = token;
            this.remain = remain;
            this.isobj = isobj;
        }

        @Override
        public String toString() {
            return token;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值