<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Collapsible JSON Formatter - view your json code in colors</title>
<meta name="description" content="Collapsible JSON Formatter - view your json code in colors">
<meta name="keywords" content="Json, Printer, Colorer, Format, Color, Collapsible">
<script>
// we need tabs as spaces and not CSS magin-left
// in order to ratain format when coping and pasing the code
window.SINGLE_TAB = " ";
window.ImgCollapsed = "images/Collapsed.gif";
window.ImgExpanded = "images/Expanded.gif";
window.QuoteKeys = true;
function $id(id){ return document.getElementById(id); }
function IsArray(obj) {
return obj &&
typeof obj === 'object' &&
typeof obj.length === 'number' &&
!(obj.propertyIsEnumerable('length'));
}
function Process(extJson){
SetTab();
window.IsCollapsible = $id("CollapsibleView").checked;
if(!!extJson) extJson = extJson.split("\n").join("\\"+"n");
var json = (!!extJson) ? extJson : $id("RawJson").value;
var html = "";
try{
if(json == "") json = "\"\"";
var obj = eval("["+json+"]");
html = ProcessObject(obj[0], 0, false, false, false);
$id("Canvas").innerHTML = "<PRE class='CodeContainer'>"+html+"</PRE>";
}catch(e){
alert("JSON is not well formated:\n"+e.message);
$id("Canvas").innerHTML = "";
}
}
window._dateObj = new Date();
window._regexpObj = new RegExp();
function ProcessObject(obj, indent, addComma, isArray, isPropertyContent){
var html = "";
var comma = (addComma) ? "<span class='Comma'>,</span> " : "";
var type = typeof obj;
var clpsHtml ="";
if(IsArray(obj)){
if(obj.length == 0){
html += GetRow(indent, "<span class='ArrayBrace'>[ ]</span>"+comma, isPropertyContent);
}else{
clpsHtml = window.IsCollapsible ? "<span><img src=\""+window.ImgExpanded+"\" onClick=\"ExpImgClicked(this)\" /></span><span class='collapsible'>" : "";
html += GetRow(indent, "<span class='ArrayBrace'>[</span>"+clpsHtml, isPropertyContent);
for(var i = 0; i < obj.length; i++){
html += ProcessObject(obj[i], indent + 1, i < (obj.length - 1), true, false);
}
clpsHtml = window.IsCollapsible ? "</span>" : "";
html += GetRow(indent, clpsHtml+"<span class='ArrayBrace'>]</span>"+comma);
}
}else if(type == 'object'){
if (obj == null){
html += FormatLiteral("null", "", comma, indent, isArray, "Null");
}else if (obj.constructor == window._dateObj.constructor) {
html += FormatLiteral("new Date(" + obj.getTime() + ") /*" + obj.toLocaleString()+"*/", "", comma, indent, isArray, "Date");
}else if (obj.constructor == window._regexpObj.constructor) {
html += FormatLiteral("new RegExp(" + obj + ")", "", comma, indent, isArray, "RegExp");
}else{
var numProps = 0;
for(var prop in obj) numProps++;
if(numProps == 0){
html += GetRow(indent, "<span class='ObjectBrace'>{ }</span>"+comma, isPropertyContent);
}else{
clpsHtml = window.IsCollapsible ? "<span><img src=\""+window.ImgExpanded+"\" onClick=\"ExpImgClicked(this)\" /></span><span class='collapsible'>" : "";
html += GetRow(indent, "<span class='ObjectBrace'>{</span>"+clpsHtml, isPropertyContent);
var j = 0;
for(var prop in obj){
var quote = window.QuoteKeys ? "\"" : "";
html += GetRow(indent + 1, "<span class='PropertyName'>"+quote+prop+quote+"</span>: "+ProcessObject(obj[prop], indent + 1, ++j < numProps, false, true));
}
clpsHtml = window.IsCollapsible ? "</span>" : "";
html += GetRow(indent, clpsHtml+"<span class='ObjectBrace'>}</span>"+comma);
}
}
}else if(type == 'number'){
html += FormatLiteral(obj, "", comma, indent, isArray, "Number");
}else if(type == 'boolean'){
html += FormatLiteral(obj, "", comma, indent, isArray, "Boolean");
}else if(type == 'function'){
if (obj.constructor == window._regexpObj.constructor) {
html += FormatLiteral("new RegExp(" + obj + ")", "", comma, indent, isArray, "RegExp");
}else{
obj = FormatFunction(indent, obj);
html += FormatLiteral(obj, "", comma, indent, isArray, "Function");
}
}else if(type == 'undefined'){
html += FormatLiteral("undefined", "", comma, indent, isArray, "Null");
}else{
html += FormatLiteral(obj.toString().split("\\").join("\\\\").split('"').join('\\"'), "\"", comma, indent, isArray, "String");
}
return html;
}
function FormatLiteral(literal, quote, comma, indent, isArray, style){
if(typeof literal == 'string')
literal = literal.split("<").join("<").split(">").join(">");
var str = "<span class='"+style+"'>"+quote+literal+quote+comma+"</span>";
if(isArray) str = GetRow(indent, str);
return str;
}
function FormatFunction(indent, obj){
var tabs = "";
for(var i = 0; i < indent; i++) tabs += window.TAB;
var funcStrArray = obj.toString().split("\n");
var str = "";
for(var i = 0; i < funcStrArray.length; i++){
str += ((i==0)?"":tabs) + funcStrArray[i] + "\n";
}
return str;
}
function GetRow(indent, data, isPropertyContent){
var tabs = "";
for(var i = 0; i < indent && !isPropertyContent; i++) tabs += window.TAB;
if(data != null && data.length > 0 && data.charAt(data.length-1) != "\n")
data = data+"\n";
return tabs+data;
}
function CollapsibleViewClicked(){
$id("CollapsibleViewDetail").style.visibility = $id("CollapsibleView").checked ? "visible" : "hidden";
Process();
}
function QuoteKeysClicked(){
window.QuoteKeys = $id("QuoteKeys").checked;
Process();
}
function CollapseAllClicked(){
EnsureIsPopulated();
TraverseChildren($id("Canvas"), function(element){
if(element.className == 'collapsible'){
MakeContentVisible(element, false);
}
}, 0);
}
function ExpandAllClicked(){
EnsureIsPopulated();
TraverseChildren($id("Canvas"), function(element){
if(element.className == 'collapsible'){
MakeContentVisible(element, true);
}
}, 0);
}
function MakeContentVisible(element, visible){
var img = element.previousSibling.firstChild;
if(!!img.tagName && img.tagName.toLowerCase() == "img"){
element.style.display = visible ? 'inline' : 'none';
element.previousSibling.firstChild.src = visible ? window.ImgExpanded : window.ImgCollapsed;
}
}
function TraverseChildren(element, func, depth){
for(var i = 0; i < element.childNodes.length; i++){
TraverseChildren(element.childNodes[i], func, depth + 1);
}
func(element, depth);
}
function ExpImgClicked(img){
var container = img.parentNode.nextSibling;
if(!container) return;
var disp = "none";
var src = window.ImgCollapsed;
if(container.style.display == "none"){
disp = "inline";
src = window.ImgExpanded;
}
container.style.display = disp;
img.src = src;
}
function CollapseLevel(level){
EnsureIsPopulated();
TraverseChildren($id("Canvas"), function(element, depth){
if(element.className == 'collapsible'){
if(depth >= level){
MakeContentVisible(element, false);
}else{
MakeContentVisible(element, true);
}
}
}, 0);
}
function TabSizeChanged(){
Process();
}
function SetTab(){
var select = $id("TabSize");
window.TAB = MultiplyString(parseInt(select.options[select.selectedIndex].value), window.SINGLE_TAB);
}
function EnsureIsPopulated(){
if(!$id("Canvas").innerHTML && !!$id("RawJson").value) Process();
}
function MultiplyString(num, str){
var sb =[];
for(var i = 0; i < num; i++){
sb.push(str);
}
return sb.join("");
}
function SelectAllClicked(){
if(!!document.selection && !!document.selection.empty) {
document.selection.empty();
} else if(window.getSelection) {
var sel = window.getSelection();
if(sel.removeAllRanges) {
window.getSelection().removeAllRanges();
}
}
var range =
(!!document.body && !!document.body.createTextRange)
? document.body.createTextRange()
: document.createRange();
if(!!range.selectNode)
range.selectNode($id("Canvas"));
else if(range.moveToElementText)
range.moveToElementText($id("Canvas"));
if(!!range.select)
range.select($id("Canvas"));
else
window.getSelection().addRange(range);
}
function LinkToJson(){
var val = $id("RawJson").value;
val = escape(val.split('/n').join(' ').split('/r').join(' '));
$id("InvisibleLinkUrl").value = val;
$id("InvisibleLink").submit();
}
</script>
<style>
*{
font-family: Georgia;
}
.Canvas
{
font: 10pt Georgia;
background-color:#ECECEC;
color:#000000;
border:solid 1px #CECECE;
}
.ObjectBrace
{
color:#00AA00;
font-weight:bold;
}
.ArrayBrace
{
color:#0033FF;
font-weight:bold;
}
.PropertyName
{
color:#CC0000;
font-weight:bold;
}
.String
{
color:#007777;
}
.Number
{
color:#AA00AA;
}
.Boolean
{
color:#0000FF;
}
.Function
{
color:#AA6633;
text-decoration:italic;
}
.Null
{
color:#0000FF;
}
.Comma
{
color:#000000;
font-weight:bold;
}
PRE.CodeContainer{
margin-top:0px;
margin-bottom:0px;
}
PRE.CodeContainer img{
cursor:pointer;
border:none;
margin-bottom:-1px;
}
#CollapsibleViewDetail a{
padding-left:10px;
}
#ControlsRow{
white-space:nowrap;
font: 11px Georgia;
}
#TabSizeHolder{
padding-left:10px;
padding-right:10px;
}
#HeaderTitle{
text-align:right;
font-size:11px;
}
#HeaderSubTitle{
margin-bottom:2px;
margin-top:0px
}
#RawJson{
width:99%;
height:130px;
}
A.OtherToolsLink { color:#555;text-decoration:none; }
A.OtherToolsLink:hover { text-decoration:underline; }
</style>
</head>
<body>
<div id="HeaderTitle"> Quick Json Formatter <span style='color:#aaa;font-weight:bold;font-style:italic'>Online</span> 1.0 Copyright (c) 2008-2009 Vladimir Bodurov <a href="http://blog.bodurov.com/Formatter-and-colorer-of-raw-JSON-code">about this tool</a></div>
<h3 id="HeaderSubTitle">Collapsible JSON Formatter</h3>
<div>Enter your JSON here: <span style='color:#777;font-size:10px'>(Your code will NOT be posted to a server, the program executes on the client)</span></div>
<textarea id="RawJson"> { "programmers": [
{ "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" },
{ "firstName": "Jason", "lastName":"Hunter", "email": "bbbb" }
],
"authors": [
{ "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" }
],
"musicians": "Eric",
}</textarea>
<div id="ControlsRow">
<input type="Button" value="Format" onClick="Process()"/>
<span id="TabSizeHolder">
tab size:
<select id="TabSize" onChange="TabSizeChanged()">
<option value="1">1</option>
<option value="2">2</option>
<option value="3" selected="true">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
</select>
</span>
<label for="QuoteKeys">
<input type="checkbox" id="QuoteKeys" onClick="QuoteKeysClicked()" checked="true" />
Keys in Quotes
</label>
<a href="javascript:void(0);" onClick="SelectAllClicked()">select all</a>
<span id="CollapsibleViewHolder" >
<label for="CollapsibleView">
<input type="checkbox" id="CollapsibleView" onClick="CollapsibleViewClicked()" checked="true" />
Collapsible View
</label>
</span>
<span id="CollapsibleViewDetail">
<a href="javascript:void(0);" onClick="ExpandAllClicked()">expand all</a>
<a href="javascript:void(0);" onClick="CollapseAllClicked()">collapse all</a>
<a href="javascript:void(0);" onClick="CollapseLevel(3)">level 2+</a>
<a href="javascript:void(0);" onClick="CollapseLevel(4)">level 3+</a>
<a href="javascript:void(0);" onClick="CollapseLevel(5)">level 4+</a>
<a href="javascript:void(0);" onClick="CollapseLevel(6)">level 5+</a>
<a href="javascript:void(0);" onClick="CollapseLevel(7)">level 6+</a>
<a href="javascript:void(0);" onClick="CollapseLevel(8)">level 7+</a>
<a href="javascript:void(0);" onClick="CollapseLevel(9)">level 8+</a>
</span>
</div>
<div id="Canvas" class="Canvas"></div>
<form id="InvisibleLink" action="http://www.bodurov.com/JsonFormatter/view.aspx" target="_blank">
<input type="hidden" id="InvisibleLinkUrl" name="json" value="" />
</form>
<div style="font-size:10px;color:grey;text-align:right;margin-top:20px">
<input type="button" value="link to this json" onClick="LinkToJson()" style="color:#777" />
my other tools:
<a href="http://www.bodurov.com/NearestStars/" class="OtherToolsLink">
Nearest Stars</a>
<a href="http://www.bodurov.com/VectorVisualizer/" class="OtherToolsLink">
Vector Visualizer</a>
<!--a href="http://www.bodurov.com/BitmapVectorizer/" class="OtherToolsLink">
Bitmap Vectorizer</a-->
</div>
<script>Process(" { \"programmers\": [ { \"firstName\": \"Brett\", \"lastName\":\"McLaughlin\", \"email\": \"aaaa\" }, { \"firstName\": \"Jason\", \"lastName\":\"Hunter\", \"email\": \"bbbb\" } ], \"authors\": [ { \"firstName\": \"Isaac\", \"lastName\": \"Asimov\", \"genre\": \"science fiction\" } ], \"musicians\": \"Eric\", }");</script>
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-2223138-1";
urchinTracker();
function onLoad() {
var version = getSilverlightVersion();
if (version) { __utmSetVar(version); }
}
function getSilverlightVersion() {
var version = 'No Silverlight';
var container = null;
try {
var control = null;
if (window.ActiveXObject) {
control = new ActiveXObject('AgControl.AgControl');
}
else {
if (navigator.plugins['Silverlight Plug-In']) {
container = document.createElement('div');
document.body.appendChild(container);
container.innerHTML= '<embed type="application/x-silverlight" src="data:," />';
control = container.childNodes[0];
}
}
if (control) {
if (control.isVersionSupported('4.0')) { version = 'Silverlight/4.0'; }
else if (control.isVersionSupported('3.0')) { version = 'Silverlight/3.0'; }
else if (control.isVersionSupported('2.0')) { version = 'Silverlight/2.0'; }
else if (control.isVersionSupported('1.0')) { version = 'Silverlight/1.0'; }
}
}
catch (e) { }
if (container) {
document.body.removeChild(container);
}
return version;
}
onLoad();
</script>
</body>
</html>
json formatter(一个检查json格式是否正确的小工具)
最新推荐文章于 2024-08-10 07:52:32 发布