Javascript 在jade中输出服务器生成的json对象,而不进行json解析

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

我有一个不符合JSON标准的JSON对象,我无法更改该对象的结构以使其符合JSON标准

我需要让这个对象呈现在一个JavaScript块中间的一个玉石模板中。该对象实际上是模板中功能块中的配置对象

这是物体

{
  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$/,'}'))