在没有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 

你可以看到jsObjvariables的输出,如果你交换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在顶层以下,那么将会变得更加复杂。