| Module | JSON::Pure::Generator::GeneratorMethods::Hash |
| In: |
lib/json/pure/generator.rb
|
Returns a JSON string containing a JSON object, that is unparsed from this Hash instance. state is a JSON::State object, that can also be used to configure the produced JSON string output further. depth is used to find out nesting depth, to indent accordingly.
# File lib/json/pure/generator.rb, line 236
236: def to_json(state = nil, depth = 0, *)
237: if state
238: state = JSON.state.from_state(state)
239: state.check_max_nesting(depth)
240: json_check_circular(state) { json_transform(state, depth) }
241: else
242: json_transform(state, depth)
243: end
244: end
# File lib/json/pure/generator.rb, line 248
248: def json_check_circular(state)
249: if state and state.check_circular?
250: state.seen?(self) and raise JSON::CircularDatastructure,
251: "circular data structures not supported!"
252: state.remember self
253: end
254: yield
255: ensure
256: state and state.forget self
257: end
# File lib/json/pure/generator.rb, line 259
259: def json_shift(state, depth)
260: state and not state.object_nl.empty? or return ''
261: state.indent * depth
262: end
# File lib/json/pure/generator.rb, line 264
264: def json_transform(state, depth)
265: delim = ','
266: if state
267: delim << state.object_nl
268: result = '{'
269: result << state.object_nl
270: result << map { |key,value|
271: s = json_shift(state, depth + 1)
272: s << key.to_s.to_json(state, depth + 1)
273: s << state.space_before
274: s << ':'
275: s << state.space
276: s << value.to_json(state, depth + 1)
277: }.join(delim)
278: result << state.object_nl
279: result << json_shift(state, depth)
280: result << '}'
281: else
282: result = '{'
283: result << map { |key,value|
284: key.to_s.to_json << ':' << value.to_json
285: }.join(delim)
286: result << '}'
287: end
288: result
289: end