2016年6月6日月曜日

[JSON形式?]オブジェクトをテキストに変換する[evalで復元可能]

数値や文字列、関数や配列など様々な型のプロパティを持つオブジェクトをテキストに変換するプログラムを作成しました。
作成したテキストをeval関数に渡すと元通りのオブジェクトが作成できます。
ただし以下のような、循環参照を含むオブジェクトを渡すと無限ループしてしまいます。

[循環参照を含むオブジェクトの例]
  obj = {a:0, b:1}
  obj.c = obj
<job>
<script>
forIn = function(obj,fun){var name,res; for(name in obj){if(res=fun(name, obj[name])){return res}}}
;(function(){
var rYn=/\n/g, rYr=/\r/g, rDQ=/[""]/g, rArr=/Array/, rDat=/Date/, YnYt='\n\t', date_='date', num='number', boo='boolean', und='undefined', str='string', obj='object', nul='null', fun='function', DQ='"', YY='\\\\', YYn='\\n', YYr='\\r', YYdq='\\"', headF='(function(){', varObj='\nvar obj = ', footF='\n\treturn obj\n})()', arr='[]', newDate='new Date("', datEnd='")'
var str0='\nobj[', str1='] = ', len0='', str2='{', str3='\n}', comma=',', Yn='\n', str4=' : '
var forIn0=function(o){var s=len0; forIn(o, function(n,v){s+= str0 + me(n) + str1 + me(v)}); return s}
var forIn1=function(o){var s=len0; forIn(o, function(n,v){s+= (s?comma:len0) + Yn + me(n) + str4 + me(v)}); return s}
var funcインデント調整=function(fun){ var str=fun.toString(), 最終行=str.match(/([\t ]*)\}$/)[1], reg=new RegExp('\\n'+最終行,'g'); return str.replace(reg,'\n') }
var me = obj2txt = function(o){
if(!o && o!=0 && o!=null && typeof(o)!=date_){ return }
switch(typeof(o)){
case num:case boo:case und:return o
case str:return DQ + o.replace(/\\/g,YY).replace(rYn,YYn).replace(rYr,YYr).replace(rDQ,YYdq) + DQ
case obj:
if(o==null){ return nul }
if(o.constructor.toString().match(rArr)){
return headF + (varObj + arr + forIn0(o)).replace(rYn,YnYt) + footF
}else if(o.constructor.toString().match(rDat)){
return headF + (varObj + newDate + o + datEnd + forIn0(o)).replace(rYn,YnYt) + footF
}else{
return str2 + forIn1(o).replace(rYn,YnYt) + str3
}
case fun:
return (headF + (varObj + funcインデント調整(o) + forIn0(o)).replace(rYn,YnYt) + footF)
case date_:
return headF + varObj + newDate + o + datEnd + forIn0(o) + footF
}
}
})();
obj = {
a:function(b,c){return c-d},
b:new Date(),
c:1,
d:"aiueo'\"",
e:[1,2,3]
}
obj.e.f = 456
str = obj2txt(obj)
eval('obj0 = '+str)
WScript.Echo(str + '\n\n' + obj2txt(obj0))
</script>
</job>
view raw obj2txt.wsf hosted with ❤ by GitHub

[実行結果]

0 件のコメント:

コメントを投稿