json 1.4.2 → 1.4.3
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of json might be problematic. Click here for more details.
- data/CHANGES +4 -0
- data/VERSION +1 -1
- data/ext/json/ext/generator/generator.c +117 -135
- data/lib/json/version.rb +1 -1
- data/tests/test_json.rb +22 -1
- metadata +2 -2
data/CHANGES
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
2010-05-05 (1.4.3)
|
2
|
+
* Fixed some test assertions, from Ruby r27587 and r27590, patch by nobu.
|
3
|
+
* Fixed issue http://github.com/flori/json/issues/#issue/20 reported by
|
4
|
+
electronicwhisper@github. Thx!
|
1
5
|
2010-04-26 (1.4.2)
|
2
6
|
* Applied patch from naruse Yui NARUSE <naruse@airemix.com> to make building with
|
3
7
|
Microsoft Visual C possible again.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.4.
|
1
|
+
1.4.3
|
@@ -738,150 +738,132 @@ static VALUE cState_aref(VALUE self, VALUE name)
|
|
738
738
|
static void generate_json(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj, long depth)
|
739
739
|
{
|
740
740
|
VALUE tmp;
|
741
|
-
|
742
|
-
|
743
|
-
|
744
|
-
|
745
|
-
|
746
|
-
|
747
|
-
|
748
|
-
|
749
|
-
|
750
|
-
|
751
|
-
|
752
|
-
|
753
|
-
|
754
|
-
|
755
|
-
|
756
|
-
|
757
|
-
|
758
|
-
|
759
|
-
|
760
|
-
|
761
|
-
|
762
|
-
|
763
|
-
|
764
|
-
|
765
|
-
|
766
|
-
|
767
|
-
|
768
|
-
|
769
|
-
fbuffer_append(buffer, indent, indent_len);
|
770
|
-
}
|
771
|
-
}
|
772
|
-
key = rb_ary_entry(keys, i);
|
773
|
-
key_to_s = rb_funcall(key, i_to_s, 0);
|
774
|
-
Check_Type(key_to_s, T_STRING);
|
775
|
-
generate_json(buffer, Vstate, state, key_to_s, depth);
|
776
|
-
fbuffer_append(buffer, delim2, delim2_len);
|
777
|
-
generate_json(buffer, Vstate, state, rb_hash_aref(obj, key), depth);
|
778
|
-
}
|
779
|
-
depth--;
|
780
|
-
if (object_nl) {
|
781
|
-
fbuffer_append(buffer, object_nl, object_nl_len);
|
782
|
-
if (indent) {
|
783
|
-
for (j = 0; j < depth; j++) {
|
784
|
-
fbuffer_append(buffer, indent, indent_len);
|
785
|
-
}
|
786
|
-
}
|
741
|
+
VALUE klass = CLASS_OF(obj);
|
742
|
+
if (klass == rb_cHash) {
|
743
|
+
char *object_nl = state->object_nl;
|
744
|
+
long object_nl_len = state->object_nl_len;
|
745
|
+
char *indent = state->indent;
|
746
|
+
long indent_len = state->indent_len;
|
747
|
+
long max_nesting = state->max_nesting;
|
748
|
+
char *delim = FBUFFER_PTR(state->object_delim);
|
749
|
+
long delim_len = FBUFFER_LEN(state->object_delim);
|
750
|
+
char *delim2 = FBUFFER_PTR(state->object_delim2);
|
751
|
+
long delim2_len = FBUFFER_LEN(state->object_delim2);
|
752
|
+
int i, j;
|
753
|
+
VALUE key, key_to_s, keys;
|
754
|
+
depth++;
|
755
|
+
if (max_nesting != 0 && depth > max_nesting) {
|
756
|
+
fbuffer_free(buffer);
|
757
|
+
rb_raise(eNestingError, "nesting of %ld is too deep", depth);
|
758
|
+
}
|
759
|
+
fbuffer_append_char(buffer, '{');
|
760
|
+
keys = rb_funcall(obj, rb_intern("keys"), 0);
|
761
|
+
for(i = 0; i < RARRAY_LEN(keys); i++) {
|
762
|
+
if (i > 0) fbuffer_append(buffer, delim, delim_len);
|
763
|
+
if (object_nl) {
|
764
|
+
fbuffer_append(buffer, object_nl, object_nl_len);
|
765
|
+
}
|
766
|
+
if (indent) {
|
767
|
+
for (j = 0; j < depth; j++) {
|
768
|
+
fbuffer_append(buffer, indent, indent_len);
|
787
769
|
}
|
788
|
-
fbuffer_append_char(buffer, '}');
|
789
770
|
}
|
790
|
-
|
791
|
-
|
792
|
-
|
793
|
-
|
794
|
-
|
795
|
-
|
796
|
-
|
797
|
-
|
798
|
-
|
799
|
-
|
800
|
-
|
801
|
-
depth
|
802
|
-
|
803
|
-
fbuffer_free(buffer);
|
804
|
-
rb_raise(eNestingError, "nesting of %ld is too deep", depth);
|
771
|
+
key = rb_ary_entry(keys, i);
|
772
|
+
key_to_s = rb_funcall(key, i_to_s, 0);
|
773
|
+
Check_Type(key_to_s, T_STRING);
|
774
|
+
generate_json(buffer, Vstate, state, key_to_s, depth);
|
775
|
+
fbuffer_append(buffer, delim2, delim2_len);
|
776
|
+
generate_json(buffer, Vstate, state, rb_hash_aref(obj, key), depth);
|
777
|
+
}
|
778
|
+
depth--;
|
779
|
+
if (object_nl) {
|
780
|
+
fbuffer_append(buffer, object_nl, object_nl_len);
|
781
|
+
if (indent) {
|
782
|
+
for (j = 0; j < depth; j++) {
|
783
|
+
fbuffer_append(buffer, indent, indent_len);
|
805
784
|
}
|
806
|
-
|
807
|
-
|
808
|
-
|
809
|
-
|
810
|
-
|
811
|
-
|
812
|
-
|
813
|
-
|
814
|
-
|
815
|
-
|
785
|
+
}
|
786
|
+
}
|
787
|
+
fbuffer_append_char(buffer, '}');
|
788
|
+
} else if (klass == rb_cArray) {
|
789
|
+
char *array_nl = state->array_nl;
|
790
|
+
long array_nl_len = state->array_nl_len;
|
791
|
+
char *indent = state->indent;
|
792
|
+
long indent_len = state->indent_len;
|
793
|
+
long max_nesting = state->max_nesting;
|
794
|
+
char *delim = FBUFFER_PTR(state->array_delim);
|
795
|
+
long delim_len = FBUFFER_LEN(state->array_delim);
|
796
|
+
int i, j;
|
797
|
+
depth++;
|
798
|
+
if (max_nesting != 0 && depth > max_nesting) {
|
799
|
+
fbuffer_free(buffer);
|
800
|
+
rb_raise(eNestingError, "nesting of %ld is too deep", depth);
|
801
|
+
}
|
802
|
+
fbuffer_append_char(buffer, '[');
|
803
|
+
if (array_nl) fbuffer_append(buffer, array_nl, array_nl_len);
|
804
|
+
for(i = 0; i < RARRAY_LEN(obj); i++) {
|
805
|
+
if (i > 0) fbuffer_append(buffer, delim, delim_len);
|
806
|
+
if (indent) {
|
807
|
+
for (j = 0; j < depth; j++) {
|
808
|
+
fbuffer_append(buffer, indent, indent_len);
|
816
809
|
}
|
817
|
-
|
818
|
-
|
819
|
-
|
820
|
-
|
821
|
-
|
822
|
-
|
823
|
-
|
824
|
-
|
810
|
+
}
|
811
|
+
generate_json(buffer, Vstate, state, rb_ary_entry(obj, i), depth);
|
812
|
+
}
|
813
|
+
depth--;
|
814
|
+
if (array_nl) {
|
815
|
+
fbuffer_append(buffer, array_nl, array_nl_len);
|
816
|
+
if (indent) {
|
817
|
+
for (j = 0; j < depth; j++) {
|
818
|
+
fbuffer_append(buffer, indent, indent_len);
|
825
819
|
}
|
826
|
-
fbuffer_append_char(buffer, ']');
|
827
820
|
}
|
828
|
-
|
829
|
-
|
830
|
-
|
821
|
+
}
|
822
|
+
fbuffer_append_char(buffer, ']');
|
823
|
+
} else if (klass == rb_cString) {
|
824
|
+
fbuffer_append_char(buffer, '"');
|
831
825
|
#ifdef HAVE_RUBY_ENCODING_H
|
832
|
-
|
826
|
+
obj = rb_funcall(obj, i_encode, 1, CEncoding_UTF_8);
|
833
827
|
#endif
|
834
|
-
|
835
|
-
|
836
|
-
|
837
|
-
|
838
|
-
|
839
|
-
|
840
|
-
|
841
|
-
|
842
|
-
|
843
|
-
|
844
|
-
|
845
|
-
|
846
|
-
|
847
|
-
|
848
|
-
|
849
|
-
|
850
|
-
|
851
|
-
|
852
|
-
|
853
|
-
|
854
|
-
|
855
|
-
|
856
|
-
|
857
|
-
|
858
|
-
|
859
|
-
|
860
|
-
|
861
|
-
|
862
|
-
if (!allow_nan) {
|
863
|
-
if (isinf(value)) {
|
864
|
-
fbuffer_free(buffer);
|
865
|
-
rb_raise(eGeneratorError, "%u: %s not allowed in JSON", __LINE__, StringValueCStr(tmp));
|
866
|
-
} else if (isnan(value)) {
|
867
|
-
fbuffer_free(buffer);
|
868
|
-
rb_raise(eGeneratorError, "%u: %s not allowed in JSON", __LINE__, StringValueCStr(tmp));
|
869
|
-
}
|
870
|
-
}
|
871
|
-
fbuffer_append(buffer, RSTRING_PAIR(tmp));
|
872
|
-
}
|
873
|
-
break;
|
874
|
-
default:
|
875
|
-
if (rb_respond_to(obj, i_to_json)) {
|
876
|
-
tmp = rb_funcall(obj, i_to_json, 2, Vstate, INT2FIX(depth + 1));
|
877
|
-
Check_Type(tmp, T_STRING);
|
878
|
-
fbuffer_append(buffer, RSTRING_PAIR(tmp));
|
879
|
-
} else {
|
880
|
-
tmp = rb_funcall(obj, i_to_s, 0);
|
881
|
-
Check_Type(tmp, T_STRING);
|
882
|
-
generate_json(buffer, Vstate, state, tmp, depth + 1);
|
828
|
+
if (state->ascii_only) {
|
829
|
+
convert_UTF8_to_JSON_ASCII(buffer, obj);
|
830
|
+
} else {
|
831
|
+
convert_UTF8_to_JSON(buffer, obj);
|
832
|
+
}
|
833
|
+
fbuffer_append_char(buffer, '"');
|
834
|
+
} else if (obj == Qnil) {
|
835
|
+
fbuffer_append(buffer, "null", 4);
|
836
|
+
} else if (obj == Qfalse) {
|
837
|
+
fbuffer_append(buffer, "false", 5);
|
838
|
+
} else if (obj == Qtrue) {
|
839
|
+
fbuffer_append(buffer, "true", 4);
|
840
|
+
} else if (klass == rb_cFixnum) {
|
841
|
+
fbuffer_append_long(buffer, FIX2LONG(obj));
|
842
|
+
} else if (klass == rb_cBignum) {
|
843
|
+
tmp = rb_funcall(obj, i_to_s, 0);
|
844
|
+
fbuffer_append(buffer, RSTRING_PAIR(tmp));
|
845
|
+
} else if (klass == rb_cFloat) {
|
846
|
+
double value = RFLOAT_VALUE(obj);
|
847
|
+
char allow_nan = state->allow_nan;
|
848
|
+
tmp = rb_funcall(obj, i_to_s, 0);
|
849
|
+
if (!allow_nan) {
|
850
|
+
if (isinf(value)) {
|
851
|
+
fbuffer_free(buffer);
|
852
|
+
rb_raise(eGeneratorError, "%u: %s not allowed in JSON", __LINE__, StringValueCStr(tmp));
|
853
|
+
} else if (isnan(value)) {
|
854
|
+
fbuffer_free(buffer);
|
855
|
+
rb_raise(eGeneratorError, "%u: %s not allowed in JSON", __LINE__, StringValueCStr(tmp));
|
883
856
|
}
|
884
|
-
|
857
|
+
}
|
858
|
+
fbuffer_append(buffer, RSTRING_PAIR(tmp));
|
859
|
+
} else if (rb_respond_to(obj, i_to_json)) {
|
860
|
+
tmp = rb_funcall(obj, i_to_json, 2, Vstate, INT2FIX(depth + 1));
|
861
|
+
Check_Type(tmp, T_STRING);
|
862
|
+
fbuffer_append(buffer, RSTRING_PAIR(tmp));
|
863
|
+
} else {
|
864
|
+
tmp = rb_funcall(obj, i_to_s, 0);
|
865
|
+
Check_Type(tmp, T_STRING);
|
866
|
+
generate_json(buffer, Vstate, state, tmp, depth + 1);
|
885
867
|
}
|
886
868
|
}
|
887
869
|
|
data/lib/json/version.rb
CHANGED
data/tests/test_json.rb
CHANGED
@@ -173,7 +173,18 @@ class TC_JSON < Test::Unit::TestCase
|
|
173
173
|
assert_equal({'foo'=>'bar'}, parse(' { "foo" : "bar" } '))
|
174
174
|
end
|
175
175
|
|
176
|
-
class SubHash < Hash
|
176
|
+
class SubHash < Hash
|
177
|
+
def to_json(*a)
|
178
|
+
{
|
179
|
+
JSON.create_id => self.class.name,
|
180
|
+
}.merge(self).to_json(*a)
|
181
|
+
end
|
182
|
+
|
183
|
+
def self.json_create(o)
|
184
|
+
o.delete JSON.create_id
|
185
|
+
new.merge(o)
|
186
|
+
end
|
187
|
+
end
|
177
188
|
|
178
189
|
def test_parse_object_custom_class
|
179
190
|
res = parse('{}', :object_class => SubHash)
|
@@ -181,6 +192,16 @@ class TC_JSON < Test::Unit::TestCase
|
|
181
192
|
assert_equal(SubHash, res.class)
|
182
193
|
end
|
183
194
|
|
195
|
+
def test_generation_of_core_subclasses
|
196
|
+
obj = SubHash.new.merge( "foo" => SubHash.new.merge("bar" => true))
|
197
|
+
obj_json = JSON(obj)
|
198
|
+
obj_again = JSON(obj_json)
|
199
|
+
assert_kind_of SubHash, obj_again
|
200
|
+
assert_kind_of SubHash, obj_again['foo']
|
201
|
+
assert obj_again['foo']['bar']
|
202
|
+
assert_equal obj, obj_again
|
203
|
+
end
|
204
|
+
|
184
205
|
def test_parser_reset
|
185
206
|
parser = Parser.new(@json)
|
186
207
|
assert_equal(@hash, parser.parse)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: json
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Florian Frank
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-
|
12
|
+
date: 2010-05-05 00:00:00 +02:00
|
13
13
|
default_executable: edit_json.rb
|
14
14
|
dependencies: []
|
15
15
|
|