简单的JsonParser(Java)
用以测试时写的小工具,以备忘。
代码
in java8
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;public class JsonParser {static char bracesOpen = '{';static char bracesClose = '}';static char bracketOpen = '[';static char bracketClose = ']';static char colon = ':';static char comma = ',';static char doubleQuote = '"';public enum TokenType {INIT(0), NORMAL_TOKEN(1), STRING(2), BRACESO(3),BRACESC(4), BRACKETO(5), BRACKETC(6), COLON(7),COMMA(8);TokenType (int v) {value = v;}private int value;public String toString() {switch (value) {case 0:return "Token_Init";case 1:return "Token_Normal";case 2:return "Token_String";case 3:return "Token_BraceOpen";case 4:return "Token_BraceClose";case 5:return "Token_BracketOpen";case 6:return "Token_BracketClose";case 7:return "Token_Colon";case 8:return "Token_Comma";}return "Token_ERR";}}static class Pair<F, S> {public F first;public S second;Pair(F f, S s) {first = f;second = s;}}static Map<Character, TokenType> reservedMap = new HashMap<>();static {reservedMap.put(bracesOpen, TokenType.BRACESO);reservedMap.put(bracesClose, TokenType.BRACESC);reservedMap.put(bracketOpen, TokenType.BRACKETO);reservedMap.put(bracketClose, TokenType.BRACKETC);reservedMap.put(colon, TokenType.COLON);reservedMap.put(comma, TokenType.COMMA);reservedMap.put(doubleQuote, TokenType.STRING);}private static Pair<String, Integer> GetStringToken(String str, int begin) {int idx = begin;StringBuffer ret = new StringBuffer();boolean trans = false, end = false;while (idx < str.length() && !end) {char curChar = str.charAt(idx);switch (curChar) {case '"':if (trans) {ret.append('"');trans = false;} else {end = true;}break;case '\\':if (trans) {ret.append('\\');trans = false;} else {trans = true;}break;case '\'':ret.append('\'');trans = false;default:if (trans) {System.err.println("Error trans: " + curChar);System.exit(11);}ret.append(curChar);break;}if (!end) { idx++; }}return new Pair<>(ret.toString(), idx);}private static ArrayList<Pair<String, TokenType>> GetToken(String jsonStr) {ArrayList<Pair<String, TokenType>> ret = new ArrayList<>();int i = 0;boolean foundBeginner = false;TokenType type = TokenType.INIT;for (int j = 0; j < jsonStr.length(); ++j) {char curChar = jsonStr.charAt(j);if (Character.isWhitespace(curChar)) {if (foundBeginner) {ret.add(new Pair<>(jsonStr.substring(i, j), TokenType.NORMAL_TOKEN));foundBeginner = false;type = TokenType.INIT;}continue;}// System.out.println("cur char: " + curChar + ", j:" + j);TokenType curType = reservedMap.get(curChar);if (curType == null) {if (!foundBeginner) {if (type != TokenType.INIT && type != TokenType.NORMAL_TOKEN) {ret.add(new Pair<>(jsonStr.substring(i, j), type));}i = j;foundBeginner = true;type = TokenType.NORMAL_TOKEN;}continue;}if (curType == TokenType.STRING) {if (type == TokenType.NORMAL_TOKEN) {ret.add(new Pair<>(jsonStr.substring(i, j), TokenType.NORMAL_TOKEN));}if (j + 1 < jsonStr.length()) {int idx = jsonStr.indexOf(doubleQuote, j + 1);if (idx < 0) {System.err.println("Error 3");System.exit(3);}Pair<String, Integer> strAndEndIdx = GetStringToken(jsonStr, j + 1);// String str = jsonStr.substring(j + 1, idx);String str = strAndEndIdx.first;ret.add(new Pair<>(str, TokenType.STRING));j = strAndEndIdx.second;} else {System.err.println("Error 2");break;}type = TokenType.INIT;i = j;} else {if (type == TokenType.INIT) {ret.add(new Pair<>(jsonStr.substring(j, j + 1), curType));} else {ret.add(new Pair<>(jsonStr.substring(i, j), type));type = curType;i = j;foundBeginner = false;}if (j == jsonStr.length() - 1) {ret.add(new Pair<>(jsonStr.substring(j), type));}}}return ret;}private static Pair<HashMap<String, Object>, Integer> GetObject(ArrayList<Pair<String, TokenType>> tokens, int idx) {HashMap<String, Object> ret = new HashMap<>();// tokens.get(idx)if (idx >= tokens.size() - 1) {System.err.println("Error 5");System.exit(5);}while(tokens.get(++idx).second != TokenType.BRACESC) {Pair<String, TokenType> curToken = tokens.get(idx);// System.out.println("cur token:" + curToken.first);if (curToken.second == TokenType.COMMA) { continue; }if (curToken.second != TokenType.STRING) {System.err.println("key should be string type, get " + curToken.second);System.exit(6);}String key = curToken.first;curToken = tokens.get(++idx);// System.out.println("cur token:" + curToken.first);if (curToken.second != TokenType.COLON) {System.err.println("key should followed by colon, get" + curToken.second);System.exit(7);}curToken = tokens.get(++idx);// System.out.println("cur token:" + curToken.first);if (curToken.second == TokenType.BRACESO) {Pair<HashMap<String, Object>, Integer> res = GetObject(tokens, idx);idx = res.second;ret.put(key, res.first);} else if (curToken.second == TokenType.STRING || curToken.second == TokenType.NORMAL_TOKEN) {ret.put(key, curToken.first);} else if (curToken.second == TokenType.BRACKETO) {Pair<ArrayList<Object>, Integer> res = GetArray(tokens, idx);idx = res.second;ret.put(key, res.first);} else {System.err.println("Wrong value type: " + curToken.second);System.exit(8);}}return new Pair<>(ret, idx);}private static Pair<ArrayList<Object>, Integer> GetArray(ArrayList<Pair<String, TokenType>> tokens, int idx) {ArrayList<Object> array = new ArrayList<>();if (idx >= tokens.size() - 1) {System.err.println("Error 9");System.exit(9);}Pair<String, TokenType> curToken = null;while((curToken = tokens.get(++idx)).second != TokenType.BRACKETC) {// System.out.println("cur token:" + curToken.first);switch (curToken.second) {case COMMA:continue;case STRING:case NORMAL_TOKEN:array.add(curToken.first);break;case BRACKETO:Pair<ArrayList<Object>, Integer> res = GetArray(tokens, idx);idx = res.second;array.add(res.first);break;case BRACESO:Pair<HashMap<String, Object>, Integer> ores = GetObject(tokens, idx);idx = ores.second;array.add(ores.first);break;default:System.err.println("Array can not append type " + curToken.second);System.exit(10);}}return new Pair<>(array, idx);}public static HashMap<String, Object> ParseJson(String strJson) {ArrayList<Pair<String, TokenType>> tokens = GetToken(strJson);Pair<HashMap<String, Object>, Integer> ret = GetObject(tokens, 0);return ret.first;}public static void main(String[] args) {String s = "{\n" +" \"common_feature\" : [\n" +" {\n" +" \"name\" : \"a\",\n" +" \"type\" : \"string\",\n" +" \"value\" : \"shanghai\"\n" +" },\n" +" {\n" +" \"name\" : \"b\",\n" +" \"type\" : \"string\",\n" +" \"value\" : \"beijing\"\n" +" }\n" +" ],\n" +"\n" +" \"item_feature\" : {\n" +" \"101\" : [\n" +" {\n" +" \"name\" : \"c\",\n" +" \"type\" : \"int64\",\n" +" \"value\" : 456\n" +" },\n" +" {\n" +" \"name\" : \"d\",\n" +" \"type\" : \"int64\",\n" +" \"value\" : 250\n" +" },\n" +" {\n" +" \"name\" : \"e\",\n" +" \"type\" : \"float\",\n" +" \"value\" : 135.1\n" +" },\n" +" {\n" +" \"name\" : \"f\",\n" +" \"type\" : \"float\",\n" +" \"value\" : 0.0\n" +" }\n" +" ],\n" +"\n" +" \"102\" : [\n" +" {\n" +" \"name\" : \"g\",\n" +" \"type\" : \"int64\",\n" +" \"value\" : 457\n" +" },\n" +" {\n" +" \"name\" : \"h\",\n" +" \"type\" : \"int64\",\n" +" \"value\" : 251\n" +" },\n" +" {\n" +" \"name\" : \"i\",\n" +" \"type\" : \"float\",\n" +" \"value\" : 133.1\n" +" },\n" +" {\n" +" \"name\" : \"j\",\n" +" \"type\" : \"float\",\n" +" \"value\" : 0.0\n" +" }\n" +" ]\n" +" }\n" +"}";HashMap<String, Object> theMap = ParseJson(s);HashMap<String, Object> docs = (HashMap<String, Object>) theMap.getOrDefault("item_feature", null);System.out.println("docs is null:" + (docs == null));docs.forEach((k, v) -> {System.out.println("docid: " + k);ArrayList<HashMap<String, Object>> docFeats = (ArrayList<HashMap<String, Object>>) v;for (HashMap<String, Object> feat : docFeats) {// ArrayList<HashMap<String, Object>> doc = (ArrayList<HashMap<String, Object>>) docFeat;System.out.println(feat.get("type"));System.out.println(feat.get("name"));System.out.println(feat.get("value"));}});ArrayList<HashMap<String, Object>> comm =(ArrayList<HashMap<String, Object>>) theMap.getOrDefault("common_feature", null);for (HashMap<String, Object> comFeat : comm) {System.out.println(comFeat.get("type"));System.out.println(comFeat.get("name"));System.out.println(comFeat.get("value"));}System.out.println("OK
简单的JsonParser(Java)相关推荐
- 文本文件 java_简单的用java实现读/写文本文件的示例
简单的用java实现读/写文本文件的示例 更新时间:2008年07月26日 13:09:26 作者: 同时也展示了如果从输入流中读出来内容写入输出流中(仅限文本流) 三个例子可以独立存在,所以根据 ...
- 历史上最简单的一道Java面试题,但无人能通过
作者:方志宏 来源:zhuanlan.zhihu.com/p/57859872 这可能是历史上最简单的一道java面试题了. 题目很简单,完成代码,判断一个整数是否是奇数: public boolea ...
- java http服务端例子_简单的用 Java Socket 编写的 HTTP 服务器应用
/*** SimpleHttpServer.java*/importjava.io.*;importjava.net.*;importjava.util.StringTokenizer;/*** 一个 ...
- 菜鸟学Java(六)——简单验证码生成(Java版)
转载自 菜鸟学Java(六)--简单验证码生成(Java版) 验证码大家都知道,它的作用也不用我多说了吧.如果不太清楚请参见百度百科中的解释,一般验证码的生成就是随机产生字符(数字.字母或者汉字等) ...
- java 简单考试系统 ——java程序设计
java 简单考试系统 --java程序设计 import java.util.Random; import java.util.Scanner;public class shuru {public ...
- 简单计算器(Java实训)
简单计算器(Java实训) 实训目的: 掌握 Java GUI 开发中的布局管理和事件处理机制. 实训要求: (1)要使用 java 的 GUI 设计出计算器界面.(2)通过界面 按钮,可以实现整数或 ...
- 简单明了实现Java地图小程序项目
简单明了实现Java地图小程序项目 ✨博主介绍 前言 地图概述 地图技术 地图应用场景 网约车服务 智能穿戴 智能物流 智能景区 车联网 国内常见地图 地图API与搜索 JS API GL(演示百度地 ...
- 超简单的配置java环境变量(绝对路径)
超简单的配置java环境变量(绝对路径) 之前一开始学习java的时候糊里糊涂配好了环境变量,也是费了好大的牛劲,配了卸卸了重新配.前几天学妹让我给她看看环境变量,瞬间觉得环境变量真的很好懂,只要你搞 ...
- JAVA实现简单的文本文件(java的组件和事件处理)
实现简单的窗口 java提供的JFrame类的实例就是一个底层的容器,JFrame类是Container类的间接子类.当需要一个窗口是可以使用JFrame类或其子类创建一个对象.窗口也是一个容器,可以 ...
- 令牌桶简单实现(Java)
令牌桶简单实现(Java) 文章目录 令牌桶简单实现(Java) 简介 实现思路 code main输出结果 简介 百度可得,令牌桶是一个桶,定时往里面放令牌,然后请求来了从令牌桶里取令牌,取到了继续 ...
最新文章
- shell 基本使用
- 马上开始写 react ES6 --- 基于gulp 和 Babel 的脚手架
- Android性能优化常见问题,附架构师必备技术详解
- 怎样评价推荐系统的结果质量?
- windows server 2008 系列讲座三部曲--在线讲座预告
- spring整合junit测试
- Linux 下如何处理包含空格和特殊字符的文件名
- 江苏单招计算机网络试卷,江苏省2016年对口单招计算机专业综合理论试卷.doc
- linux怎么远程命令,Linux远程命令
- 编程必备:c/c++的编程经验技巧!
- 计算机通信网络面试题,【算法通信面试题】面试问题:计算机网络(七… - 看准网...
- animate.css在vue项目中的使用
- python元组遍历
- android optionmenu 动态显示,android – 如何在onCreateOptionsMenu中动态更改菜单
- 【软考软件评测师】2016综合知识历年真题
- linux 蓝牙编程avrcp,bluetooth(蓝牙) AVRCP协议概念及代码流程解析
- c语言2种软件下载,C语言代码自动整理工具
- 关于opencv在vs201x中的设置 2020-02-04
- Android城市公交查询系统,书签基于android平台的实时公交查询系统
- Java学习笔记之 Lambda表达式
热门文章
- 商业银行的科技发展趋势
- 基于VUE的后台管理系统
- flux 中 filter 的使用和原理
- 4. Flux.filter与Flux.filterWhen的区别与联系
- jquery $.each(data, function (index, value) { }
- [重要]招募计划 - 积微速成报名结果
- python下载包失败,下载python包失败
- CSS中英文换行问题
- linux 查看ko符号表,linux modprobe命令参数及用法详解--linux加载模块命令
- MVC框架基本工作原理