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

MIT 许可证

230KB
5K SLoC

docs.rs

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();
}

组合器

封装一个或两个匹配器。它实现了基本逻辑运算符(NOTORAND)。

处理器

分析器

存储匹配的路径以分析 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