【Json】Json分词器
package com.hy; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.StringUtils; class Token{ static final int TYPE_LBRACE=0;// 左大括号 static final int TYPE_RBRACE=1;// 右大括号 static final int TYPE_TEXT=2;// 文本 static final int TYPE_COMMA=3;// 逗号 static final int TYPE_COLON=4;// 冒号 static final int TYPE_LBRACKET=5;// 左中括号 static final int TYPE_RBRACKET=6;// 右中括号 int type; String text; public Token(char c,int type) { this.text=String.valueOf(c); this.type=type; } public Token(String word,int type) { this.text=word; this.type=type; } } /** * Json文本分词器 * @author 逆火 * * 2019年12月1日 上午11:35:43 */ public class Lexer { private List<Token> tokenList; /** * Contructor * @param jsonStr */ public Lexer(String jsonStr) { tokenList=new ArrayList<Token>(); String line=""; for(int i=0;i<jsonStr.length();i++){ char c=jsonStr.charAt(i); if(Character.isWhitespace(c)){ continue; }else if(c=='{'){ Token t=new Token(c,Token.TYPE_LBRACE); tokenList.add(t); }else if(c=='}'){ if(StringUtils.isNotEmpty(line)) { Token w=new Token(line,Token.TYPE_TEXT); tokenList.add(w); line=""; } Token t=new Token(c,Token.TYPE_RBRACE); tokenList.add(t); }else if(c=='['){ Token t=new Token(c,Token.TYPE_LBRACKET); tokenList.add(t); }else if(c==']'){ Token t=new Token(c,Token.TYPE_RBRACKET); tokenList.add(t); }else if(c==',') { if(StringUtils.isNotEmpty(line)) { Token w=new Token(line,Token.TYPE_TEXT); tokenList.add(w); line=""; } Token t=new Token(c,Token.TYPE_COMMA); tokenList.add(t); }else if(c==':') { if(StringUtils.isNotEmpty(line)) { Token w=new Token(line,Token.TYPE_TEXT); tokenList.add(w); line=""; } Token t=new Token(c,Token.TYPE_COLON); tokenList.add(t); }else { line+=c; } } } public List<Token> getTokenList() { return tokenList; } public void printTokens() { int idx=0; for(Token t:tokenList) { idx++; System.out.println("#"+idx+" "+t.text); } } /** * Entry point */ public static void main(String[] args) { String filePathname="D:\\logs\\1.json"; try { StringBuilder sb=new StringBuilder(); BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePathname), "UTF-8")); String line = null; while( ( line = br.readLine() ) != null ) { sb.append(line); } br.close(); String jsonStr=sb.toString(); System.out.println("Raw json="+jsonStr); Lexer l=new Lexer(jsonStr); l.printTokens(); } catch (FileNotFoundException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } } }
输出:
Raw json={ "status": "0000", "message": "success", "data": { "title": { "id": "001", "name" : "白菜" }, "content": [ { "id": "001", "value":"你好 白菜" }, { "id": "002", "value":"你好 萝卜" } ] }} #1 { #2 "status" #3 : #4 "0000" #5 , #6 "message" #7 : #8 "success" #9 , #10 "data" #11 : #12 { #13 "title" #14 : #15 { #16 "id" #17 : #18 "001" #19 , #20 "name" #21 : #22 "白菜" #23 } #24 , #25 "content" #26 : #27 [ #28 { #29 "id" #30 : #31 "001" #32 , #33 "value" #34 : #35 "你好白菜" #36 } #37 , #38 { #39 "id" #40 : #41 "002" #42 , #43 "value" #44 : #45 "你好萝卜" #46 } #47 ] #48 } #49 }
--END-- 2019年12月1日12:29:00
【Json】Json分词器的更多相关文章
- 推荐一款JSON字符串查看器
JSON Viewer是一款方便易用的Json格式查看器.Json格式的数据阅读性很差,如果数据量大的话再阅读方面会十分困难,有了这软件,问题就解决了,能够快速把Json字符串排列规则的树结构,支持对 ...
- php 解析json失败,解析为空,json在线解析器可以解析,但是json_decode()解析失败(原)
$str2='{"code":200,"datas":{"id":1,"coupon_id":"123&quo ...
- 自制基于HMM的中文分词器
不像英文那样单词之间有空格作为天然的分界线, 中文词语之间没有明显界限.必须采用一些方法将中文语句划分为单词序列才能进一步处理, 这一划分步骤即是所谓的中文分词. 主流中文分词方法包括基于规则的分词, ...
- elasticsearch分词器Jcseg安装手册
Jcseg是什么? Jcseg是基于mmseg算法的一个轻量级中文分词器,同时集成了关键字提取,关键短语提取,关键句子提取和文章自动摘要等功能,并且提供了一个基于Jetty的web服务器,方便各大语言 ...
- Elasticsearch 分词器
无论是内置的分析器(analyzer),还是自定义的分析器(analyzer),都由三种构件块组成的:character filters , tokenizers , token filters. 内 ...
- ElasticSearch6.5.0 【安装IK分词器】
不得不夸奖一下ES的周边资源,比如这个IK分词器,紧跟ES的版本,卢本伟牛逼!另外ES更新太快了吧,几乎不到半个月一个小版本就发布了!!目前已经发了6.5.2,估计我还没怎么玩就到7.0了. 下载 分 ...
- elasticsearch中文分词器ik-analyzer安装
前面我们介绍了Centos安装elasticsearch 6.4.2 教程,elasticsearch内置的分词器对中文不友好,只会一个字一个字的分,无法形成词语,别急,已经有大拿把中文分词器做好了, ...
- es-07-head插件-ik分词器插件
5.x以后, es对head插件的支持并不是特别好 而且kibana的功能越来越强大, 建议使用kibana 1, head插件安装 在一台机器上安装head插件就可以了 1), 更新,安装依赖 su ...
- elasticsearch安装ansj分词器
1.概述 elasticsearch用于搜索引擎,需要设置一些分词器来优化索引.常用的有ik_max_word: 会将文本做最细粒度的拆分.ik_smart: 会做最粗粒度的拆分.ansj等. ...
随机推荐
- linux删除命令的简单查找使用--临时找来用的
---恢复内容开始--- linux删除某个文件:rm -f filename; mysql清空数据库,并且主键回到1:TRUNCATE TABLE tablename: drop tab ...
- 3D中OBJ文件格式详解
常见到的*.obj文件有两种:第一种是基于COFF(Common Object File Format)格式的OBJ文件(也称目标文件),这种格式用于编译应用程序:第二种是Alias|Wavefron ...
- 设置grep高亮显示匹配项和基本用法
设置grep高亮显示匹配项 方法1:设置别名 编辑vim~/.bashrc 添加如下一行内容: alias grep = 'grep --color=auto' source ~/.bashrc // ...
- openstack创建实例时aborted: Block Device Mapping is Invalid
问题产生原因: 直接先不创建新卷,点击否,待实例创建完毕后再分配卷.
- 神经网络(11)--具体实现:unrolling parameters
我们需要将parameters从矩阵unrolling到向量,这样我们就可以使用adanced optimization routines. unroll into vectors costFunct ...
- PLSQl的使用技巧与快捷键
最近在开发过程中,遇到一些麻烦,就是开发效率问题,有时候其他同事使用PLSQL 编程效率明显高于自己,观察了好久,才发现他使用PLSQL 已经很长时间了而且,他自己也在其中添加了好多快捷方式, ...
- wamp——添加多版本PHP
前言 从下载到部署,手把手教学~ wamp 版本 | 3.0.4 32位 步骤 下载PHP 进入网站https://windows.php.net/download然后选择想要的版本下载 注意点: . ...
- Django --- 常用字段及参数
1 ORM字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. IntegerField 一个整数类型 ...
- 2019-2020-1 20199312《Linux内核原理与分析》第七周作业
进程的描述 操作系统内核实现操作系统的三大管理功能 进程管理(内核中最核心的功能) 内存管理 文件系统 在操作系统中,我们通过进程控制块PCB描述进程. 为了管理进程,内核必须对每个进程进行清晰的描述 ...
- Õ() Big-O-notation
Õ只是大\(O\)表示法的变种,忽略了对数因子: \[f(n) \in \tilde O(h(n))\] \[=> \exists k : f(n) \in O \!\left( h(n)\lo ...