Skip to content

Commit ee5e1e3

Browse files
author
Anil Maurya
committed
Change symbolize_names to symbolize_keys option
1 parent 06fbe4b commit ee5e1e3

File tree

4 files changed

+79
-62
lines changed

4 files changed

+79
-62
lines changed

README.md

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,22 @@ Example: logs.json with following content
107107
"17/May/2015:08:05:23 +0000"
108108
"17/May/2015:08:05:24 +0000"
109109
```
110+
If size of json batch is greater than 1 MB then use `batch_size` option
110111

112+
```
113+
FastJsonparser.load_many(f.path, batch_size: 2_000) {}
114+
```
115+
116+
4. Accept optional param :symbolize_keys (default symbolize_keys: true)
117+
118+
If string key is expected in parsed result then use
119+
120+
```
121+
FastJsonparser.parse('{"one": 1, "two": 2}', symbolize_keys: false)
122+
123+
```
111124

112-
4. Raise FastJsonparser::ParseError when invalid JSON provided for parsing
125+
5. Raise FastJsonparser::ParseError when invalid JSON provided for parsing
113126

114127
```
115128
FastJsonparser.parse("123: 1") # FastJsonparser::ParseError (parse error)

ext/fast_jsonparser/fast_jsonparser.cpp

Lines changed: 57 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -7,66 +7,67 @@ VALUE rb_eFastJsonparserUnknownError, rb_eFastJsonparserParseError;
77
using namespace simdjson;
88

99
// Convert tape to Ruby's Object
10-
static VALUE make_ruby_object(dom::element element, bool symbolize_names)
10+
static VALUE make_ruby_object(dom::element element, bool symbolize_keys)
1111
{
1212
switch (element.type())
1313
{
14-
case dom::element_type::ARRAY:
14+
case dom::element_type::ARRAY:
15+
{
16+
VALUE ary = rb_ary_new();
17+
for (dom::element x : element)
1518
{
16-
VALUE ary = rb_ary_new();
17-
for (dom::element x : element)
18-
{
19-
VALUE e = make_ruby_object(x, symbolize_names);
20-
rb_ary_push(ary, e);
21-
}
22-
return ary;
19+
VALUE e = make_ruby_object(x, symbolize_keys);
20+
rb_ary_push(ary, e);
2321
}
24-
case dom::element_type::OBJECT:
22+
return ary;
23+
}
24+
case dom::element_type::OBJECT:
25+
{
26+
VALUE hash = rb_hash_new();
27+
for (dom::key_value_pair field : dom::object(element))
2528
{
26-
VALUE hash = rb_hash_new();
27-
for (dom::key_value_pair field : dom::object(element))
29+
std::string_view view(field.key);
30+
VALUE k = rb_utf8_str_new(view.data(), view.size());
31+
if (symbolize_keys)
2832
{
29-
std::string_view view(field.key);
30-
VALUE k = rb_utf8_str_new(view.data(), view.size());
31-
if (symbolize_names) {
32-
k = ID2SYM(rb_intern_str(k));
33-
}
34-
VALUE v = make_ruby_object(field.value, symbolize_names);
35-
rb_hash_aset(hash, k, v);
33+
k = ID2SYM(rb_intern_str(k));
3634
}
37-
return hash;
38-
}
39-
case dom::element_type::INT64:
40-
{
41-
return LONG2NUM(element.get<int64_t>());
42-
}
43-
case dom::element_type::UINT64:
44-
{
45-
return ULONG2NUM(element.get<uint64_t>());
46-
}
47-
case dom::element_type::DOUBLE:
48-
{
49-
return DBL2NUM(double(element));
50-
}
51-
case dom::element_type::STRING:
52-
{
53-
std::string_view view(element);
54-
return rb_utf8_str_new(view.data(), view.size());
55-
}
56-
case dom::element_type::BOOL:
57-
{
58-
return bool(element) ? Qtrue : Qfalse;
59-
}
60-
case dom::element_type::NULL_VALUE:
61-
{
62-
return Qnil;
35+
VALUE v = make_ruby_object(field.value, symbolize_keys);
36+
rb_hash_aset(hash, k, v);
6337
}
38+
return hash;
39+
}
40+
case dom::element_type::INT64:
41+
{
42+
return LONG2NUM(element.get<int64_t>());
43+
}
44+
case dom::element_type::UINT64:
45+
{
46+
return ULONG2NUM(element.get<uint64_t>());
47+
}
48+
case dom::element_type::DOUBLE:
49+
{
50+
return DBL2NUM(double(element));
51+
}
52+
case dom::element_type::STRING:
53+
{
54+
std::string_view view(element);
55+
return rb_utf8_str_new(view.data(), view.size());
56+
}
57+
case dom::element_type::BOOL:
58+
{
59+
return bool(element) ? Qtrue : Qfalse;
60+
}
61+
case dom::element_type::NULL_VALUE:
62+
{
63+
return Qnil;
64+
}
6465
}
6566
// unknown case (bug)
6667
rb_raise(rb_eException, "[BUG] must not happen");
6768
}
6869

69-
static VALUE rb_fast_jsonparser_parse(VALUE self, VALUE arg, VALUE symbolize_names)
70+
static VALUE rb_fast_jsonparser_parse(VALUE self, VALUE arg, VALUE symbolize_keys)
7071
{
7172
Check_Type(arg, T_STRING);
7273

@@ -76,10 +77,10 @@ static VALUE rb_fast_jsonparser_parse(VALUE self, VALUE arg, VALUE symbolize_nam
7677
{
7778
rb_raise(rb_eFastJsonparserParseError, "%s", error_message(error));
7879
}
79-
return make_ruby_object(doc, RTEST(symbolize_names));
80+
return make_ruby_object(doc, RTEST(symbolize_keys));
8081
}
8182

82-
static VALUE rb_fast_jsonparser_load(VALUE self, VALUE arg, VALUE symbolize_names)
83+
static VALUE rb_fast_jsonparser_load(VALUE self, VALUE arg, VALUE symbolize_keys)
8384
{
8485
Check_Type(arg, T_STRING);
8586

@@ -89,15 +90,16 @@ static VALUE rb_fast_jsonparser_load(VALUE self, VALUE arg, VALUE symbolize_name
8990
{
9091
rb_raise(rb_eFastJsonparserParseError, "%s", error_message(error));
9192
}
92-
return make_ruby_object(doc, RTEST(symbolize_names));
93+
return make_ruby_object(doc, RTEST(symbolize_keys));
9394
}
9495

95-
static VALUE rb_fast_jsonparser_load_many(VALUE self, VALUE arg, VALUE symbolize_names, VALUE batch_size)
96+
static VALUE rb_fast_jsonparser_load_many(VALUE self, VALUE arg, VALUE symbolize_keys, VALUE batch_size)
9697
{
9798
Check_Type(arg, T_STRING);
9899
Check_Type(batch_size, T_FIXNUM);
99100

100-
try {
101+
try
102+
{
101103
dom::parser parser;
102104
auto [docs, error] = parser.load_many(RSTRING_PTR(arg), FIX2INT(batch_size));
103105
if (error != SUCCESS)
@@ -107,11 +109,13 @@ static VALUE rb_fast_jsonparser_load_many(VALUE self, VALUE arg, VALUE symbolize
107109

108110
for (dom::element doc : docs)
109111
{
110-
rb_yield(make_ruby_object(doc, RTEST(symbolize_names)));
112+
rb_yield(make_ruby_object(doc, RTEST(symbolize_keys)));
111113
}
112114

113115
return Qnil;
114-
} catch (simdjson::simdjson_error error) {
116+
}
117+
catch (simdjson::simdjson_error error)
118+
{
115119
rb_raise(rb_eFastJsonparserUnknownError, "%s", error.what());
116120
}
117121
}

lib/fast_jsonparser.rb

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,16 @@ module FastJsonparser
1111
DEFAULT_BATCH_SIZE = 1_000_000 # from include/simdjson/dom/parser.h
1212

1313
class << self
14-
def parse(source, symbolize_names: true)
15-
_parse(source, symbolize_names)
14+
def parse(source, symbolize_keys: true)
15+
_parse(source, symbolize_keys)
1616
end
1717

18-
def load(source, symbolize_names: true)
19-
_load(source, symbolize_names)
18+
def load(source, symbolize_keys: true)
19+
_load(source, symbolize_keys)
2020
end
2121

22-
def load_many(source, symbolize_names: true, batch_size: DEFAULT_BATCH_SIZE, &block)
23-
_load_many(source, symbolize_names, batch_size, &block)
22+
def load_many(source, symbolize_keys: true, batch_size: DEFAULT_BATCH_SIZE, &block)
23+
_load_many(source, symbolize_keys, batch_size, &block)
2424
rescue UnknownError => error
2525
case error.message
2626
when "This parser can't support a document that big"

test/fast_jsonparser_test.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ def test_string_encoding
1515
end
1616

1717
def test_symbols_encoding
18-
hash = FastJsonparser.parse('{"École": 1}', symbolize_names: true)
18+
hash = FastJsonparser.parse('{"École": 1}', symbolize_keys: true)
1919
assert_includes hash, :"École"
2020
assert_equal Encoding::UTF_8, hash.keys.first.encoding
2121

22-
hash = FastJsonparser.parse('{"École": 1}', symbolize_names: false)
22+
hash = FastJsonparser.parse('{"École": 1}', symbolize_keys: false)
2323
assert_includes hash, "École"
2424
assert_equal Encoding::UTF_8, hash.keys.first.encoding
2525
end

0 commit comments

Comments
 (0)