Parse JSON text and compress to binary format.
20% smaller and 20% faster.
JSON text parser benchmark
Name |
Time |
Codebase |
gason |
707 |
650 |
RapidJSON |
1734 |
38,112 |
jsonc |
984 |
889 (jvalue.* + jparser.*) |
yyjson |
542 |
18,000 |
Format |
Size |
Parse Time |
JSON text |
100% |
100% |
version 1 |
20% |
20% |
version 3 |
90% |
0 |
//parser
JsonAllocator allocator;
JsonParser parser(&allocator);
Value* value0 = parser.parse((char*)str.c_str());
//check error
if (!value0 || parser.get_error()[0] != 0) {
printf("parser json error: %s\n", parser.get_error());
return;
}
//get value
Value* node = value0->get("value");
int a = node->as_int();
//object iteration
for (auto it = node->begin(); it != node->end(); ++it) {
const char* key = it->get_name();
const char* val = it->as_str();
}
jc::JsonAllocator allocator;
jc::JsonNode* root = allocator.allocNode(jc::Type::Object);
root->insert_pair("version", allocator.alloc_str("1.0"));
jc::JsonNode* list = allocator.allocNode(jc::Type::Array);
auto p1 = allocator.alloc_int(0);
auto p2 = allocator.alloc_int(1);
array->insert(p1);
array->insert(p2);
array->reverse();
root->insert_pair(allocator.strdup(propertyName), array);
root->reverse();
//dump json str
std::string jstr;
value0->to_json(jstr);
puts(jstr.c_str());
//write
JCWriter c;
c.write(value, out);
//read
JsonAllocator allocator;
JCReader r(buffer, length, &allocator);
Value* value = r.read();
//write
JEncoder encoder;
auto buffer = encoder.encode(value);
out.write(buffer.data(), buffer.size());
//read
value = JEncoder::decode(buffer, length);
HiML is a JSON like data format for serialization.
//comment
name = form
Pane {
x = 1
y = 2
Button {
id = button1
x=1
y=2
}
Button {
x = 1, y = 2
}
1,2,3,
a
b
c
}
- no array, object as array
- no data type, metadata in mind
- quotes is options
- comma is options
- no braces for top level object
- comment by //
Type |
ExtType |
Length(optional) |
Data(optional) |
4bit |
4bit |
1/2/4/8byte |
length byte |
Name |
Type |
ExtType |
null |
primi |
0 |
true |
primi |
1 |
false |
primi |
2 |
Name |
Type |
ExtType |
Length |
tiny int |
1 |
0~10,11 |
|
int8 |
1 |
12 |
1byte |
int16 |
1 |
13 |
2byte |
int32 |
1 |
14 |
4byte |
int64 |
1 |
15 |
8byte |
tiny float |
2 |
0~10,11 |
|
float32 |
2 |
14 |
4byte |
float64 |
2 |
15 |
8byte |
Name |
Type |
ExtType |
Length |
Data |
array |
3 |
0~10,12,13,14,15 |
1/2/4/8byte |
val1,val2,... |
object |
4 |
0~10,12,13,14,15 |
1/2/4/8byte |
key1,val1,key2,val2,... |
Name |
Type |
ExtType |
Length |
Data |
new string |
5 |
0~10,12,13,14,15 |
1/2/4/8byte |
data |
Name |
Type |
ExtType |
Index |
ref |
6 |
0~10,12,13,14,15 |
1/2/4/8byte |