【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等. ...
随机推荐
- oracle命令行导出、导入dmp文件
1.导出语句: exp test/test@127.0.0.1:1521/orcl file=d:\gpmgt.dmp full=n: 导出test用户数据库对象,full=n表示默认只导出test用 ...
- SpringBoot返回date日期格式化
SpringBoot返回date日期格式化,解决返回为TIMESTAMP时间戳格式或8小时时间差 问题描述 在Spring Boot项目中,使用@RestController注解,返回的java对象中 ...
- 解决 Jumpserver coco 使用登录用户(ldap)进行SSH连接目标主机,忽略系统用户
前言 Jumpserver 作为国内流行的开源堡垒机,很多公司都在尝试使用,同时 Jumpserver 为了契合众多公司的用户认证,也提供了 LDAP 的用户认证方式,作为 Jumpserver 的用 ...
- 调试freeradius 3.0 与microsoft AD通过LDAP认证的笔记
首先来参考文章: a.https://blog.51cto.com/liqingbiao/2146832?utm_source=oschina-app 这个主要参考了基本安装.配置.测试 b.http ...
- pip---cannot import name main解决方案
.先来看下Python不同版本对应的路径 which python3. which python3. .使用update-alternatives --install建立链接 sudo update- ...
- .NET C#利用反射获取类文件以及其中的方法&属性 并获取类及方法上的特性
了解C#特性类并声明我们自己的特性类[AttributeTest]代码如下 using System; namespace AttributeTest { /* 特性说明 特性本质是一个继承和使用了系 ...
- 201671030116 宋菲菲 实验十四 团队项目评审&课程学习总结
项目 内容 作业所属课程 所属课程 作业要求 作业要求 课程学习目标 (1)掌握软件项目评审会流程:(2)反思总结课程学习内容 任务一:团队项目审核已完成.项目验收过程意见表已上交. 任务二:课程学习 ...
- 【Java】《Java程序设计基础教程》第五章学习
5.1 抽象类 Java语言中,父类的某些方法不包括任何逻辑,并且需要由子类重写.在这种情况下,用abstract关键字来修饰一个类时,这个类叫做抽象类,用abstract关键字来修饰一个方法时,这个 ...
- Oracle字符串中包含数字、特殊符号的排序
问题描述: 某小区,需要按照小区.楼栋.单元号.房间号进行排序,但是按照地址描述排序时,因为字符串中包含数字,所以造成了如下的结果, 1号楼之后应该是2号楼,但是查询结果却是10号楼 . 尝试解决 使 ...
- 示例 NetworkWordCount
import org.apache.spark.storage.StorageLevel import org.apache.spark.streaming.{Seconds, StreamingCo ...