Javascript 在jade中输出服务器生成的json对象,而不进行json解析
我有一个不符合JSON标准的JSON对象,我无法更改该对象的结构以使其符合JSON标准 我需要让这个对象呈现在一个JavaScript块中间的一个玉石模板中。该对象实际上是模板中功能块中的配置对象 这是物体Javascript 在jade中输出服务器生成的json对象,而不进行json解析,javascript,json,node.js,pug,Javascript,Json,Node.js,Pug,我有一个不符合JSON标准的JSON对象,我无法更改该对象的结构以使其符合JSON标准 我需要让这个对象呈现在一个JavaScript块中间的一个玉石模板中。该对象实际上是模板中功能块中的配置对象 这是物体 { services: [], version: "1438276796258", country: "default", role: "User", Zack_Init: function () { }, Zack_Global: function (even
{
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处理对象时,它会在转换过程中删除这三个函数
我添加了一个plunker来显示当前解决方案的进度。其输出如下。唯一剩下的就是删除格式化字符
{"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"]}
函数转换字符串(obj){
返回JSON.stringify(obj,函数(k,v){
return(typeof v=='function'?['@@beginFunction@'、v.toString()、'@@endFunction@')。join(“”):v);
}).replace(/“@@beginFunction@@@|@@endFunction@@@g'”);
}
obj={
服务:[],
版本:“1438276796258”,
国家:“默认”,
角色:“用户”,
Zack_Init:function(){
},
Zack_全局:功能(事件){
},
Zack_PostRender:函数(){
},
渲染器:['渲染器','无']
};
$('#test').text(convertToString(obj))代码>
编辑:配置对象是否需要动态选择或修改?你能用一个包裹吗?如果不是,那么unescaped buffer code()似乎是处理readFile返回的字符串的方法
严格化解决方案:
编辑:比我的原始提案更好的解决方案:
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('');
}
函数funcyStringify(obj){
var funcMap={};
var sections=JSON.stringify(obj,函数(k,v){
如果(v的类型==='函数'){
funcMap[k]=v;
返回['@@function@',k'@@function@'];
}
返回v;
}).split(/“?@@function@@@g”);
对于(变量i=1;i
如果需要在引用不同函数的嵌套对象中使用相同的属性名,则需要做更多的工作
原文是:
对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>
var configObject={
:
};
如果函数低于顶层,则会变得更复杂。为了安全地删除新行字符,应首先删除“注释”:
函数转换字符串(obj){
返回JSON.stringify(obj,函数(k,v){
返回(
v的类型!=“功能”?
五:
v、 toString().replace(/\/\/.*?$/mg',)//删除单行注释
.replace(//\/\*[\s\s]*?\*\//g',)//删除多行注释
.replace(//[\r\n]/g',)//删除新行
);
},2).替换(/“(function.+)”,?$/gm,$1');//删除函数周围的引号
}
obj={
服务:[],
版本:“1438276796258”,
国家:“默认”,
角色:“用户”,
Zack_Init:function(){
//评论
var a=1;//注释//
如果(a===/*注释*/3){//comment
/*评论
评论*/
}
/*结束*/
},
Zack_全局:功能(事件){
},
Zack_PostRender:函数(){
},
渲染器:['渲染器','无']
};
$('#result').text(convertToString(obj))代码>
如果我正确理解了您的请求(即您希望获取外部加载的文件的内容,然后将其加载到
块中),那么我认为迄今为止探索的解决方案在很大程度上是过度设计的
以下是我所拥有的:
// 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;
然后在你的翡翠档案中:
block content
h1= title
script!= jsObj
如果将script
交换为pre
,您可以看到jsObj
变量的输出,但是script
会满足您的要求。具体问题是什么?你试过什么没用的?您只是显示一个字符串吗?已更新以给出实际问题。更好的解决方案是让我非常接近,但是.toString()
方法添加了格式化字符,如\n
和\t
。我怎样才能同时删除它们?已编辑以删除\n和\t。还将替换字符串从空字符串更改为单空格,以防万一。如果在函数中使用双引号或转义字符(您可以随意使用替换正则表达式,可能需要多次替换调用),则需要对其进行更多修改,但是我发现它会干扰代码/
中的注释,然后注释掉整个javascript块。我在这上面加了一笔赏金。希望我们能弄清楚最后一部分,我会把赏金扔给你的。谢谢:)@zmanc,编辑;希望它对您有效:)--一个限制是,当前无法处理引用不同函数的具有相同属性名的嵌套对象。这让我大部分时间都在那里,这是我需要处理的一小部分,但这是解决方案的基础。谢谢。对于那些好奇的人,以下是我必须更改的两件事:.replace(/[\r\n\t]/g',)
.replace(/\u007d$/,'}'))