module TolerateJson::Formatter
Public Class Methods
format_json_string(json, indentation_character=nil)
click to toggle source
# File lib/tolerate_json.rb, line 5 def self.format_json_string(json, indentation_character=nil) indentation_character ||= ' ' return json if json.to_s.size < 1 json.gsub!("\r\n", '') json.gsub!("\n", '') json.gsub!("\r", '') if json.match(/[^\n]\}$/) json.gsub!(/\}$/, "\n}") json.gsub!(/\}\}/, "}\n}") end if json.match(/[^\n]\]$/) json.gsub!(/\]$/, "\n]") end json = json.to_s.gsub(/\{[\s+]\"/, "{\"").gsub(/\{(\s+)\"/, "{\"").gsub(/\"(\s+)\}/, "\"}").gsub(/true(\s+)\}/, "true}").gsub(/false(\s+)\}/, "false}").gsub(/\",(\s+)\"/, '","') json = json.gsub("},", "},\n").gsub("],", "],\n").gsub("{[", "{\n[").gsub("}]", "}\n]").gsub("[{", "[\n{").gsub("]}", "]\n}").gsub("{\"", "{\n\"").gsub("\"}", "\"\n}").gsub("\",\"", "\",\n\"").gsub(":true,\"", ":true,\n\"").gsub(":false,\"", ":false,\n\"").gsub(":true}", ":true\n}").gsub(":false}", ":false\n}").gsub(/:(\d+)}/) { ":#{$1}\n}" }.gsub(/\:(\d+),\"/) { ":#{$1},\n\"" }.gsub(/\:(\d+),\"/,":\1,\n\"") # don't put a CR in empty arrays json = json.gsub(/\[\n\s*\]/, '[]') output = [] indent_level = 0 json.split("\n").each do |s| indent_level -= 1 if ["]", "}"].include?(s.split('').first) && indent_level > 0 output << (indentation_character*indent_level) + s if ["{", "["].include?(s.split('').last) indent_level += 1 next end if ["{", "["].include?(s.split('').first) indent_level += 1 next end end output.join("\n")+"\n" end