Plist to Json
by stevetranby
HTML
<h2>PLIST -> JSON Converter</h2>
<div>
<textarea id="input" rows="15" cols="70">
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>background</key>
<string>nav-galaxy.png</string>
<key>galaxies</key>
<array>
<dict>
<key>location</key>
<string>{140,130}</string>
<key>name</key>
<string>Sol</string>
<key>systems</key>
<array>
<dict>
<key>background</key>
<string>nav-system-earth.png</string>
<key>locations</key>
<array>
<string>{}</string>
</array>
<key>missions</key>
<array>
<dict>
<key>difficulty</key>
<string>easy</string>
<key>location</key>
<string>{80,240}</string>
<key>locked</key>
<false/>
<key>missionETA</key>
<integer>240</integer>
<key>missionTitle</key>
<string>Touch the Sun</string>
<key>objectives</key>
<array/>
<key>planetTitle</key>
<string>Sun</string>
</dict>
<dict>
<key>difficulty</key>
<string>easy</string>
<key>location</key>
<string>{130,160}</string>
<key>locked</key>
<false/>
...
CSS
#output { background:gray; }
JavaScript
$(document).ready(function() {
$('#convert').click(function() {
var input = $('#input').val();
var plist = $.parseXML(input);
console.log("before:" + plist);
plist = cleanWhitespace(plist);
console.log("after:" + plist);
var json = parsePlist(plist);
console.log("json:" + json);
var formatted = JSON.stringify(json, null, 4);
$('#output').text(formatted);
});
});
cleanWhitespace = function(element) {
console.log(element);
console.log(element.childNodes);
if (element.childNodes !== undefined) {
for (var i = 0; i < element.childNodes.length; i++) {
var node = element.childNodes[i];
console.log("n:" + node);
if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) {
console.log("removing node");
element.remove(node);
}
}
}
return element;
}
parsePlist = function(plistDoc) {
var doc = plistDoc.childNodes[1];
// main dict
var dict = doc.childNodes[1];
console.log(dict);
for (i in dict.childNodes) {
node = dict.childNodes[i];
console.log("n:" + node);
}
return parsePlistValue(dict);
}
parsePlistDict = function(dictNode) {
var result = new Object();
var keyNodes = dictNode.getElementsByTagName("key");
for (var i = 0, n = keyNodes.length; i < n; i++) {
var key = keyNodes[i].firstChild.nodeValue;
var val = parsePlistValue(keyNodes[i].nextSibling.nextSibling);
result[key] = val;
}
return result;
}
parsePlistValue = function(valueNode) {
var result = null;
switch (valueNode.nodeName) {
case "true":
result = true;
break;
case "false":
result = false;
break;
case "string":
if (valueNode.firstChild != undefined) {
result = valueNode.firstChild.nodeValue;
// result = unescape(result);
// result =...