在没有jsonparsing的情况下输出一个服务器生成的json对象
我有一个JSON对象,不符合JSON标准,我不能改变对象的结构,使其遵守JSON标准。
我需要使这个对象呈现在Jade模板中的一个JavaScript块的中间。 该对象实际上是在模板中的function块中进行的configuration对象。
这是对象。
{ services: [], version: "1438276796258", country: "default", role: "User", Zack_Init: function () { }, Zack_Global: function (event) { }, Zack_PostRender: function () { }, renderers: ['Renderer', 'NONE'] }
更新这里是我从JS文件获取该对象。
function readJSFile(url, filename, callback) { fs.readFile(url, "utf-8", function (err, data) { if (err) { callback(err); return; } try { callback(filename, data); } catch (exception) { callback(exception); } }); }
当JSON.stringify处理对象时,它会在转换过程中删除这三个函数。
我正在添加一个蹲下来显示当前解决scheme的进度。 下面哪个输出。 剩下的唯一的东西是删除格式化字符。
{"services":[],"version":"1438276796258","country":"default","role":"User","Zack_Init":function () {\n\n },"Zack_Global":function (event) {\n\n },"Zack_PostRender":function () {\n\n },"renderers":["Renderer","NONE"]}
function convertToString(obj) { return JSON.stringify(obj, function(k, v) { return (typeof v === 'function' ? ['@@beginFunction@@', v.toString(), '@@endFunction@@'].join('') : v); }).replace(/"@@beginFunction@@|@@endFunction@@"/g, ''); } obj = { services: [], version: "1438276796258", country: "default", role: "User", Zack_Init: function() { }, Zack_Global: function(event) { }, Zack_PostRender: function() { }, renderers: ['Renderer', 'NONE'] }; $('#test').text(convertToString(obj));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div id="test"></div>
为了安全地删除新行字符,首先应删除“注释”:
function convertToString(obj) { return JSON.stringify(obj, function(k, v) { return ( typeof v !== 'function' ? v : v.toString().replace(/\/\/.*?$/mg, '') // removes single line comments .replace(/\/\*[\s\S]*?\*\//g, '') // removes multi-line comments .replace(/[\r\n]/g, '') // removes new line ); }, 2).replace(/"(function.+)",?$/gm, '$1'); // removes quotes around functions } obj = { services: [], version: "1438276796258", country: "default", role: "User", Zack_Init: function() { // comment var a = 1;// comment // if(a === /*comment */ 3) {//comment /* comment comment*/ } /*end*/ }, Zack_Global: function(event) { }, Zack_PostRender: function() { }, renderers: ['Renderer', 'NONE'] }; $('#result').text(convertToString(obj));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <pre id="result"></pre>
如果我正确地理解了你的请求(你想获取一个外部加载的文件的内容,然后把它加载到一个<script>
块中),我认为到目前为止已经探索的解决scheme在很大程度上是过度devise的。
这是我有:
// index.js var express = require('express'); var router = express.Router(); var fs = require('fs'); router.get('/', function(req, res, next) { readJSFile('./whacky_obj.js', 'whacky_json_obj.js', render); // used .js because OP implies that as the file source in the extraction method function render(fname, obj) { res.render('index', { jsObj: obj }); } }); // OP's readJSFile method function readJSFile(url, filename, callback) { fs.readFile(url, "utf-8", function (err, data) { if (err) { callback(err); return; } try { callback(filename, data); } catch (exception) { callback(exception); } }); } module.exports = router;
然后在你的Jade文件中:
block content h1= title script!= jsObj
你可以看到jsObj
variables的输出,如果你交换script
pre
,但script
会做你在问什么。
编辑:是configuration对象的东西,你需要select或dynamic修改? 你可以使用包括? 如果不是,那么非转义的缓冲区代码( http://jade-lang.com/reference/code/ )似乎是readFile传回的string的方式。
Stringify解决scheme:
编辑:比我原来的build议更好的解决scheme:
function funcyStringify(obj) { var funcMap = {}; var sections = JSON.stringify(obj, function(k, v) { if (typeof v === 'function') { funcMap[k] = v; return ['@@function@@', k, '@@function@@'].join(''); } return v; }).split(/"?@@function@@"?/g); for (var i = 1; i < sections.length-1; i+=2) { sections[i] = funcMap[sections[i]]; } return sections.join(''); }
如果您需要在引用不同函数的嵌套对象中使用相同的属性名称,则需要更多的工作。
最初写道:
用Jade不太熟悉它,但用EJS,你可以做这样的事情:
<script> var configObject = { <% for (var key in configObject) { if (configObject.hasOwnProperty(key)) { %> <%- key %>: <% if (typeof configObject[key] === 'function') { %> <%- configObject[key].toString() %> <% } else { %> <%- JSON.stringify(configObject[key]) %> <% } %> <% } } %> }; </script>
如果您的function在顶层以下,那么将会变得更加复杂。