2015-08-15 18 views
9

JSON standartlarına uymayan bir JSON nesnesine sahibim ve JSON standartlarına uymasını sağlamak için nesnenin yapısını değiştiremiyorum.Bir sunucuda json nesnesini json parse'siz json parse olmadan çıkar Çıktı

Bu nesneyi bir Jade şablonunda bir javascript bloğunun ortasında oluşturması gerekiyor. Nesne, aslında şablondaki bir işlev bloğuna giden bir yapılandırma nesnesidir.

Nesne İşte. Bir JS dosyasından nesneyi alıyorum nasıl İşte

{ 
    services: [], 
    version: "1438276796258", 
    country: "default", 
    role: "User", 
    Zack_Init: function() { 

    }, 
    Zack_Global: function (event) { 

    }, 
    Zack_PostRender: function() { 

    }, 
    renderers: ['Renderer', 'NONE'] 
} 

GÜNCELLEME olduğunu. JSON.stringify bu dönüştürme işleminde üç fonksiyonu damla nesne işler

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); 
    } 
    }); 
} 

.

Geçerli çözümün ilerleyişini göstermek için bir plunker ekliyorum. Aşağıdaki çıktılar. Kalan tek şey biçimlendirme karakterlerini kaldırmak.

{"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' ? ['@@[email protected]@', v.toString(), '@@[email protected]@'].join('') : v); 
 
    }).replace(/"@@[email protected]@|@@[email protected]@"/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>

+2

Özel sorun nedir? Ne denedin, işe yaramadı? Sadece bir dizi gösteriyor musunuz? –

+1

Güncel sorunu vermek için güncellendi. – zmanc

cevap

2

, 'yorum' ilk kaldırılmalıdır:

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>

+0

bu beni en çok yoldan çıkardı, bakmam gereken küçük bir parçaydı ama bu çözümlerin temeliydi. Teşekkür ederim. Merak edenler için – zmanc

+0

, değiştirmem gereken iki şey: '.replace (/ [\ r \ n \ t]/g, '')' '.replace (/ \ u007d $ /, '} , ')' – zmanc

0

DÜZENLEME: mi seçmenize veya dinamik olarak değiştirmek için gereken yapılandırma nesne şey? Bir içerir misiniz? Aksi takdirde, atılmamış arabellek kodu (http://jade-lang.com/reference/code/), readFile tarafından iletilen dizeyle devam etmenin yolu gibi görünüyor.


stringify çözeltisi:

DÜZENLEME: Benim asıl teklifle daha iyi bir çözüm: iç içe geçmiş nesneleri aynı özellik adını olması gerekir eğer biraz daha fazla iş gerekir

function funcyStringify(obj) { 
    var funcMap = {}; 
    var sections = JSON.stringify(obj, function(k, v) { 
     if (typeof v === 'function') { 
      funcMap[k] = v; 
      return ['@@[email protected]@', k, '@@[email protected]@'].join(''); 
     } 
     return v; 
    }).split(/"[email protected]@[email protected]@"?/g); 
    for (var i = 1; i < sections.length-1; i+=2) { 
     sections[i] = funcMap[sections[i]]; 
    } 
    return sections.join(''); 
} 

farklı fonksiyonlara başvurmak. İçinde bu tip dışarı Jade yeterince aşina değil

ama Ejs ile, böyle bir şey yapabileceğini:


Başlangıçta yazdı

<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> 

varsa daha karmaşık alır

Üst seviyenin altındaki fonksiyonlar. güvenle yeni satır karakterleri kaldırmak amacıyla

+0

daha iyi bir çözüm bana oldukça yakınlaşıyor, ancak .toString() yöntemi, '\ n' ve' \ t' gibi biçimlendirme karakterleri ekliyor. Bunları nasıl kaldırabilirim? – zmanc

+0

Dışarı çıkarılacak \ n ve \ t. Ayrıca, her durumda, yedek dizeyi boş dizeden tek alana dönüştürdü. Eğer fonksiyonlarınızda çift tırnak kullanırsanız veya kaçış karakterleri kullanırsanız (değiştirme rejeksiyle uğraşabilirsiniz) birden çok kez değiştirme çağrısına ihtiyaç duyabilirsiniz. – ozangds

+0

karakterleri kaldırmak işe yaramaz, ancak '//' kodunda bulunan yorumlara müdahale ettiğini ve javascript bloğunun tamamını yorumladığını buldum. Buna bir lütuf ekliyorum. Umarım bu son kısmı anlatabildik ve yolunu kellep atacağım. Teşekkürler :) – zmanc

3

Doğru (eğer içeriğini almak istediğiniz isteğinizi anlama olsam dışarıdan yüklenen bir dosyadan sonra bir <script> bloğuna yükler), sanırım şimdiye kadar keşfedilen çözümler büyük ölçüde aşırı derecede tasarlanmıştır.Sonra

// 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; 

Ve Yeşim dosyasında: Burada

Ben de buydu pre için script takas eğer jsObj değişken çıkış görebilirsiniz

block content 
    h1= title 
    script!= jsObj 

ancak script yapacak ne soruyorsun