diff --git a/java/src/json/ext/Generator.java b/java/src/json/ext/Generator.java index 914d00e7..5cc00a39 100644 --- a/java/src/json/ext/Generator.java +++ b/java/src/json/ext/Generator.java @@ -334,6 +334,8 @@ void generate(final Session session, RubyHash object, buffer.append((byte)'{'); buffer.append(objectNl); + + final int[] count = new int[]{0}; object.visitAll(new RubyHash.Visitor() { private boolean firstPair = true; @@ -357,10 +359,11 @@ public void visit(IRubyObject key, IRubyObject value) { Handler valueHandler = getHandlerFor(runtime, value); valueHandler.generate(session, value, buffer); session.infectBy(value); + count[0]++; } }); state.decreaseDepth(); - if (objectNl.length() != 0) { + if (count[0] > 0 && objectNl.length() != 0) { buffer.append(objectNl); buffer.append(Utils.repeat(state.getIndent(), state.getDepth())); } diff --git a/lib/json/pure/generator.rb b/lib/json/pure/generator.rb index ef1c2e88..f0de7d3c 100644 --- a/lib/json/pure/generator.rb +++ b/lib/json/pure/generator.rb @@ -317,6 +317,7 @@ def json_transform(state) depth = state.depth += 1 first = true indent = !state.object_nl.empty? + count = 0 each { |key,value| result << delim unless first result << state.indent * depth if indent @@ -330,10 +331,13 @@ def json_transform(state) result << %{"#{String(value)}"} end first = false + count += 1 } depth = state.depth -= 1 - result << state.object_nl - result << state.indent * depth if indent + unless count.zero? + result << state.object_nl + result << state.indent * depth if indent + end result << '}' result end diff --git a/tests/json_generator_test.rb b/tests/json_generator_test.rb index 77b539dc..2ecdc972 100755 --- a/tests/json_generator_test.rb +++ b/tests/json_generator_test.rb @@ -92,6 +92,11 @@ def test_generate end def test_generate_pretty + json = pretty_generate({}) + assert_equal(<<'EOT'.chomp, json) +{ +} +EOT json = pretty_generate(@hash) # hashes aren't (insertion) ordered on every ruby implementation # assert_equal(@json3, json)