18个稳定版本 (7个主要版本)
7.1.0 | 2021年5月10日 |
---|---|
6.3.1 | 2020年12月8日 |
6.2.0 | 2020年11月12日 |
5.0.2 | 2020年10月10日 |
0.2.0 | 2020年5月29日 |
#382 in 编码
每月21次下载
用于 5 crates
230KB
5K SLoC
Streamson Lib
Rust库,用于处理大型JSON。它旨在既节省内存又快速。
注意,它并不完全验证输入的JSON是否有效。这意味着无效的JSON可能通过而不会出错。
策略
策略 | 转换数据 | 缓冲匹配数据 | 嵌套匹配 | 使用处理器 | 使用匹配器 |
---|---|---|---|---|---|
触发 | 否 | 否 | 是 | 是 | 是 |
过滤器 | 是 | 否 | 否 | 是 | 是 |
提取 | 是 | 否 | 否 | 是 | 是 |
转换 | 是 | 否 | 否 | 是 | 是 |
所有 | 是/否 | 否 | 否 | 是 | 否 |
触发策略
它在匹配的JSON部分上触发处理器。它不返回数据作为输出。
过滤器策略
它实际上修改了JSON。如果路径匹配,则匹配的部分应从输出JSON中删除。可以使用处理器在此处将删除的部分存储到文件中。
提取策略
它也修改了JSON。它只返回匹配的部分作为输出。可以使用处理器,例如将提取的部分进行转换。
转换策略
通过调用转换处理器来修改JSON。
所有策略
匹配所有数据。可以使用处理器将整个JSON的内容进行转换或进行某种分析。
匹配器
用于匹配JSON一部分的结构。
简单
它匹配JSON中的路径。例如
{
"users": [
{"name": "carl"},
{"name": "bob"}
],
"groups": [
{"name": "admins"},
{"name": "staff"}
]
}
简单路径 {"users"}[0]{"name"}
会匹配 "carl"
。
简单的路径 {}[]{"users"}
将匹配 "carl"
和 "bob"
。
简单的路径 {}[0]{"name"}
将匹配 "carl"
和 "admins"
。
简单的路径 ??{"name"}
将匹配 "carl"
、"bob"
、"admins"
和 "staff"
。
简单的路径 *{"name"}
将匹配 "carl"
、"bob"
、"admins"
和 "staff"
。
深度
匹配 JSON 路径的深度。它有最小长度和最大长度范围(最大长度是可选的)。
正则表达式
基于正则表达式匹配路径。
示例
use streamson_lib::{handler, strategy::{self, Strategy}, matcher};
use std::{io, str::FromStr, sync::{Arc, Mutex}};
let handler = Arc::new(Mutex::new(handler::Output::new(io::stdout())));
let matcher = matcher::Regex::from_str(r#"\{"[Uu]ser"\}\[\]"#).unwrap();
let mut trigger = strategy::Trigger::new();
trigger.add_matcher(
Box::new(matcher),
handler,
);
for input in vec![
br#"{"Users": [1,2]"#.to_vec(),
br#", "users": [3, 4]}"#.to_vec(),
] {
trigger.process(&input).unwrap();
}
组合器
封装一个或两个匹配器。它实现了基本逻辑运算符(NOT
、OR
和 AND
)。
处理器
分析器
存储匹配的路径以分析 JSON 结构。
缓冲区
缓冲匹配的数据,可以在稍后手动提取。
输出
将匹配的数据写入指定的输出(例如文件或标准输出)。
缩进
转换匹配数据的缩进。
索引器
存储匹配数据的索引。
正则表达式
基于正则表达式转换数据。
示例
use streamson_lib::{matcher, strategy::{self, Strategy}, handler};
use std::sync::{Arc, Mutex};
use regex;
let converter =
Arc::new(Mutex::new(handler::Regex::new().add_regex("s/User/user/".to_string())));
let matcher = matcher::Simple::new(r#"{"users"}[]{"name"}"#).unwrap();
let mut convert = strategy::Convert::new();
// Set the matcher for convert strategy
convert.add_matcher(Box::new(matcher), converter);
for input in vec![
br#"{"users": [{"password": "1234", "name": "User1"}, {"#.to_vec(),
br#""password": "0000", "name": "user2}]}"#.to_vec(),
] {
for converted_data in convert.process(&input).unwrap() {
println!("{:?}", converted_data);
}
}
替换
使用固定数据替换匹配的输出。
缩短
缩短匹配的数据。
取消字符串化
取消字符串化匹配的数据。
示例
触发
use streamson_lib::{strategy::{self, Strategy}, error::General, handler::Output, matcher::Simple};
use std::sync::{Arc, Mutex};
use std::{io::prelude::*, io};
let mut trigger = strategy::Trigger::new();
let handler = Arc::new(Mutex::new(Output::new(io::stdout())));
let matcher = Simple::new(r#"{"users"}[]"#).unwrap();
trigger.add_matcher(Box::new(matcher), handler);
let mut buffer = [0; 2048];
let mut input = "<input data>".as_bytes();
while let Ok(size) = input.read(&mut buffer[..]) {
if !size > 0 {
break;
}
trigger.process(&buffer[..size]);
}
过滤器
use streamson_lib::{strategy::{self, Strategy}, error::General, matcher::Simple};
use std::io::prelude::*;
let mut filter = strategy::Filter::new();
let matcher = Simple::new(r#"{"users"}[]"#).unwrap();
filter.add_matcher(Box::new(matcher), None);
let mut buffer = [0; 2048];
let mut input = "<input data>".as_bytes();
while let Ok(size) = input.read(&mut buffer[..]) {
if !size > 0 {
break;
}
let output_data = filter.process(&buffer[..size]);
}
提取
use streamson_lib::{strategy::{self, Strategy}, error::General, matcher::Simple};
use std::io::prelude::*;
let mut extract = strategy::Extract::new();
let matcher = Simple::new(r#"{"users"}[]"#).unwrap();
extract.add_matcher(Box::new(matcher), None);
let mut buffer = [0; 2048];
let mut input = "<input data>".as_bytes();
while let Ok(size) = input.read(&mut buffer[..]) {
if !size > 0 {
break;
}
let output_data = extract.process(&buffer[..size]);
}
转换
use streamson_lib::{strategy::{self, Strategy}, matcher, handler};
use std::sync::{Arc, Mutex};
use std::io::prelude::*;
let mut convert = strategy::Convert::new();
let matcher = matcher::Simple::new(r#"{"list"}[]"#).unwrap();
convert.add_matcher(
Box::new(matcher),
Arc::new(Mutex::new(handler::Unstringify::new())),
);
let mut buffer = [0; 2048];
let mut input = "<input data>".as_bytes();
while let Ok(size) = input.read(&mut buffer[..]) {
if !size > 0 {
break;
}
let output_data = convert.process(&buffer[..size]);
}
所有
use streamson_lib::{strategy::{self, Strategy}, matcher, handler};
use std::sync::{Arc, Mutex};
use std::io::prelude::*;
let mut all = strategy::All::new();
let analyser = Arc::new(Mutex::new(handler::Analyser::new()));
all.add_handler(analyser.clone());
let mut buffer = [0; 2048];
let mut input = "<input data>".as_bytes();
while let Ok(size) = input.read(&mut buffer[..]) {
if !size > 0 {
break;
}
all.process(&buffer[..size]);
}
println!("{:?}", analyser.lock().unwrap().results())
特性
自定义处理器
您可以定义自己的自定义处理器。
use std::any::Any;
use streamson_lib::{handler, Path, error, streamer::Token};
#[derive(Debug)]
struct CustomHandler;
impl handler::Handler for CustomHandler {
fn start(
&mut self, _: &Path, _: usize, _: Token
) -> Result<Option<std::vec::Vec<u8>>, error::Handler> {
todo!()
}
fn feed(
&mut self, _: &[u8], _: usize,
) -> Result<Option<std::vec::Vec<u8>>, error::Handler> {
todo!()
}
fn end(
&mut self, _: &Path, _: usize, _: Token
) -> Result<Option<std::vec::Vec<u8>>, error::Handler> {
todo!()
}
fn as_any(&self) -> &dyn Any {
self
}
fn is_converter(&self) -> bool {
todo!()
}
}
自定义匹配器
您还可以定义自定义匹配器。
use streamson_lib::{matcher, Path, streamer::ParsedKind};
#[derive(Debug)]
struct CustomMatcher;
impl matcher::Matcher for CustomMatcher {
fn match_path(&self, _: &Path, _: ParsedKind) -> bool { todo!() }
}
依赖关系
~0–500KB