用以测试时写的小工具,以备忘。

代码

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)相关推荐

  1. 文本文件 java_简单的用java实现读/写文本文件的示例

    简单的用java实现读/写文本文件的示例 更新时间:2008年07月26日 13:09:26   作者: 同时也展示了如果从输入流中读出来内容写入输出流中(仅限文本流) 三个例子可以独立存在,所以根据 ...

  2. 历史上最简单的一道Java面试题,但无人能通过

    作者:方志宏 来源:zhuanlan.zhihu.com/p/57859872 这可能是历史上最简单的一道java面试题了. 题目很简单,完成代码,判断一个整数是否是奇数: public boolea ...

  3. java http服务端例子_简单的用 Java Socket 编写的 HTTP 服务器应用

    /*** SimpleHttpServer.java*/importjava.io.*;importjava.net.*;importjava.util.StringTokenizer;/*** 一个 ...

  4. 菜鸟学Java(六)——简单验证码生成(Java版)

    转载自  菜鸟学Java(六)--简单验证码生成(Java版) 验证码大家都知道,它的作用也不用我多说了吧.如果不太清楚请参见百度百科中的解释,一般验证码的生成就是随机产生字符(数字.字母或者汉字等) ...

  5. java 简单考试系统 ——java程序设计

    java 简单考试系统 --java程序设计 import java.util.Random; import java.util.Scanner;public class shuru {public ...

  6. 简单计算器(Java实训)

    简单计算器(Java实训) 实训目的: 掌握 Java GUI 开发中的布局管理和事件处理机制. 实训要求: (1)要使用 java 的 GUI 设计出计算器界面.(2)通过界面 按钮,可以实现整数或 ...

  7. 简单明了实现Java地图小程序项目

    简单明了实现Java地图小程序项目 ✨博主介绍 前言 地图概述 地图技术 地图应用场景 网约车服务 智能穿戴 智能物流 智能景区 车联网 国内常见地图 地图API与搜索 JS API GL(演示百度地 ...

  8. 超简单的配置java环境变量(绝对路径)

    超简单的配置java环境变量(绝对路径) 之前一开始学习java的时候糊里糊涂配好了环境变量,也是费了好大的牛劲,配了卸卸了重新配.前几天学妹让我给她看看环境变量,瞬间觉得环境变量真的很好懂,只要你搞 ...

  9. JAVA实现简单的文本文件(java的组件和事件处理)

    实现简单的窗口 java提供的JFrame类的实例就是一个底层的容器,JFrame类是Container类的间接子类.当需要一个窗口是可以使用JFrame类或其子类创建一个对象.窗口也是一个容器,可以 ...

  10. 令牌桶简单实现(Java)

    令牌桶简单实现(Java) 文章目录 令牌桶简单实现(Java) 简介 实现思路 code main输出结果 简介 百度可得,令牌桶是一个桶,定时往里面放令牌,然后请求来了从令牌桶里取令牌,取到了继续 ...

最新文章

  1. shell 基本使用
  2. 马上开始写 react ES6 --- 基于gulp 和 Babel 的脚手架
  3. Android性能优化常见问题,附架构师必备技术详解
  4. 怎样评价推荐系统的结果质量?
  5. windows server 2008 系列讲座三部曲--在线讲座预告
  6. spring整合junit测试
  7. Linux 下如何处理包含空格和特殊字符的文件名
  8. 江苏单招计算机网络试卷,江苏省2016年对口单招计算机专业综合理论试卷.doc
  9. linux怎么远程命令,Linux远程命令
  10. 编程必备:c/c++的编程经验技巧!
  11. 计算机通信网络面试题,【算法通信面试题】面试问题:计算机网络(七… - 看准网...
  12. animate.css在vue项目中的使用
  13. python元组遍历
  14. android optionmenu 动态显示,android – 如何在onCreateOptionsMenu中动态更改菜单
  15. 【软考软件评测师】2016综合知识历年真题
  16. linux 蓝牙编程avrcp,bluetooth(蓝牙) AVRCP协议概念及代码流程解析
  17. c语言2种软件下载,C语言代码自动整理工具
  18. 关于opencv在vs201x中的设置 2020-02-04
  19. Android城市公交查询系统,书签基于android平台的实时公交查询系统
  20. Java学习笔记之 Lambda表达式

热门文章

  1. 商业银行的科技发展趋势
  2. 基于VUE的后台管理系统
  3. flux 中 filter 的使用和原理
  4. 4. Flux.filter与Flux.filterWhen的区别与联系
  5. jquery $.each(data, function (index, value) { }
  6. [重要]招募计划 - 积微速成报名结果
  7. python下载包失败,下载python包失败
  8. CSS中英文换行问题
  9. linux 查看ko符号表,linux modprobe命令参数及用法详解--linux加载模块命令
  10. MVC框架基本工作原理