jsp实现txt文件导入,显示json的需求 现需要实现:在jsp中一按钮,能够从本地导入txt文档,然后把txt文档里的json串,在jsp上展示给用户并能让用户修改json串(增加,删除)。修改后把完成的json串,放在新生一txt文件里。跪求大神指导!jsonjsp文档js 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 无法直接读取和直接保存文件到客户端你需要用服务器做中介,负责读取文件内容输出客户端,保存的时候提交输入框中的内容给服务器,服务器设置content-disposition为attachment;filename="xxx.txt",然后输出提交的内容,就可以弹出保存文件对话框了要点就是将表单提交到隐藏的iframe中实现无刷新上传文件java不知道怎么设置响应头,下面是C#的Response.ContentType = "text/plain";Response.AddHeader("Content-Disposition", "attachment;filename=\"xxx.txt\"");Response.Write(Request.Form["txt"]);//输出提交的内容Response.End();HTML模型<script> function readContent(ifr) { document.getElementById('txt').value = ifr.contentWindow.document.body.innerHTML; }</script><iframe name="readifr" onload="readContent(this)" style="display:none"></iframe><!---选择文件后自动提交表单,xxxread.jsp负责获取文件内容并且输出---><form target="readifr" method="post" action="xxxread.jsp" enctype="multipart/form-data">选择文件:<input type="file" name="fntxt" onchange="this.form.submit()"/></form><!---xxxsave.jsp负责获取提交的内容,设置响应头并且输出---><iframe name="saveifr" style="display:none"></iframe><form target="ifr" method="post" action="xxxsave.jsp"><textarea rows="5" cols="50" name="txt" id="txt"></textarea><input type="submit" value="保存" /></form> 按按钮后用io流读txt文件 把读出的json部分在js里转换成js对象 之后操作这个对象的属性后转回json再用io流写入txt试试 首先要确定一点,这个“本地”是服务器,还是客户端。如果是在服务器上,可以考虑直接读流打开,反到前台,修改完之后写回去。如果是在客户端,可以将文件上传,在Servlet中返回页面编辑,编辑完成之后提供下载。这样可以实现这个功能。(我不知道JSP可不可以直接编辑客户端的文件。。) 。。好麻烦。。前几天给你写了生成JSON的,照你这么说,还得写一个解析JSON再生成DOM节点的。。 大神 真的是这样啊 我这导师还要让我把写的那个txt文件 然后给读出来 然后展示出来让用户修改 改了 再存到项目下面 我都疯了 !!!啊 !!! 大神 能帮忙给个思路不?谢谢!我能不能先在java部分吧json转成map,然后传到jsp然后再怎么显示呢? 好麻烦。。麻烦的不想去弄。。又得解析JSON结构。。我了个去。不过有个简单点的方法,就是你在后台不要给JSON,给的是一个数组,一个元素对应的是一行,有键位名,键位值,键位的level,键位的父节点。[{id:1,parent:0,key:'user',value:''},{id:2,parent:1,key:'name',value:'test'},{id:3,parent:1,key:'age',value:'18'},{id:4,parent:1,key:'dress',value:[]},{id:5,parent:4,key:'Tshirt',value:'aa'},{id:6,parent:4,key:'shoe',value:'bb'},]以上的数组可以解析成{ "user" : { "name": "test", "age" : '18', "dress" : [ {"Tshirt" : "aa"}, {"shoe" : "bb"}, ] }}不知道你理解没。不知道你明白不 你是说在后台就通过json串组装这个数组,然后传到jsp解析吗? 我之前的jsp已经完成了动态生成json串的步骤 现在就是读取这个json串以后 怎么样在页面显示让用户修改。 代码太长,分开来发。<!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>JSON生成</title> <style> .sub{ margin-left:5px; } div{position:relative;} .sub_child{ margin-left:20px; } </style></head><body> <div id="container"> <div> <a href="javascript:void(0)" class="other" self="first_other" id="first_other" level="1">同</a><a self="first_sub" level="1" href="javascript:void(0)" id="first_sub" class="sub">子</a><input self="first_other" type="text" name="pname" level="1" id="first_pname">:<input self="first_sub" level="1" type="text" name="pvalue" id="first_pvalue"/> <div class="sub_child"></div> </div> </div> <input value="显示JSON" type="button" id="show" /> <input value="读取JSON" type="button" id="read" /> <div id="result"></div> <script type="text/javascript"> function $(id){ return document.getElementById(id); } function getElementsByClassName(className, element) { var children = (element || document).getElementsByTagName('*'); var elements = new Array(); for (var i = 0; i < children.length; i++) { var child = children[i]; var classNames = child.className.split(' '); for (var j = 0; j < classNames.length; j++) { if (classNames[j] == className) { elements.push(child); break; } } } return elements; } var obj = {},sour = {}; window.onload = function(){ var d = document,container = $('container'); function jsonToKV(json){ var jsonObj = {}; function cutJson(json,key,par,level){ var name; while(jsonObj[name]){ name = 'name'+(new Date()).getTime(); } level = level || 0; jsonObj[name] = {}; jsonObj[name].value = json; jsonObj[name].key = key; jsonObj[name].level = level; par && (jsonObj[name].parent = par); if(gettype(json)=='[object Object]'){ level++ for(var p in json){ cutJson(json[p],p,name,level); } }else if(gettype(json)=='[object Array]'){ level++ for(var i=0,len=json.length;i<len;i++){ cutJson(json[i],i,name,level); } } } cutJson(json); for(var p in jsonObj){ if(p!=='undefined') createDomTree(p,jsonObj[p]); } return jsonObj; } function createDomTree(id,obj){ var parentDom = obj.parent ? getElementsByClassName('sub_child',$(obj.parent))[0] : $('container'); var frag = d.createDocumentFragment(); var div = d.createElement('div'); div.id = id; var othera = d.createElement('a'); othera.href="javascript:void(0)"; othera.setAttribute('level',obj.level); othera.innerHTML = '同' othera.setAttribute('self',id); obj.parent && othera.setAttribute('parent',obj.parent); var suba = othera.cloneNode(); suba.innerHTML = '子'; suba.className = 'sub'; var attrName = d.createElement('input'); attrName.name = 'pname'; attrName.type = 'text'; attrName.setAttribute('self',id); attrName.value = (typeof obj.key != 'number') ? obj.key : ''; attrName.setAttribute('level',obj.level); obj.parent && attrName.setAttribute('parent',obj.parent); var split = d.createTextNode(':'); var attrValue = attrName.cloneNode(); attrValue.name = 'pvalue'; attrValue.setAttribute('level',obj.level); if(gettype(obj.value)=='[object Object]'){ attrValue.type = 'checkbox' attrValue.checked= false; }else if(gettype(obj.value)=='[object Array]'){ attrValue.type = 'checkbox'; attrValue.checked= true; }else{ attrValue.value = obj.value; } var subcon = d.createElement('div') subcon.className= 'sub_child' var del = othera.cloneNode(); del.innerHTML = '删'; div.appendChild(othera); div.appendChild(suba); div.appendChild(attrName); div.appendChild(split); div.appendChild(attrValue); div.appendChild(del); div.appendChild(subcon); frag.appendChild(div); parentDom.appendChild(frag); } function createAttr(level,who,sub){ var now = (new Date()).getTime(); var self = 'name'+now; var _parent = level==1 ? container : (!sub ? who.parentNode.parentNode : getElementsByClassName('sub_child',who.parentNode)[0]); var frag = d.createDocumentFragment(); var con = d.createElement('div'); var othera = d.createElement('a'); othera.href="javascript:void(0)"; othera.setAttribute('level',level); othera.innerHTML = '同' othera.setAttribute('self',self); var suba = othera.cloneNode(); suba.innerHTML = '子'; suba.className = 'sub'; var attrName = d.createElement('input'); attrName.name = 'pname'; attrName.type = 'text'; attrName.setAttribute('self',self) var attrValue = attrName.cloneNode(); attrValue.name = 'pvalue'; attrValue.type = 'text'; attrName.setAttribute('self','name'+now); attrValue.setAttribute('self','name'+now); attrName.setAttribute('level',level); attrValue.setAttribute('level',level); con.appendChild(othera); con.appendChild(suba); con.appendChild(attrName); var split = d.createTextNode(':'); var subcon = d.createElement('div') subcon.className= 'sub_child' con.appendChild(split); con.appendChild(attrValue); var del = othera.cloneNode(); del.innerHTML = '删'; con.appendChild(del); con.appendChild(subcon); frag.appendChild(con); if(who){ var parentName = sub ? who.getAttribute('self') : who.getAttribute('parent'); attrName.setAttribute('parent',parentName); attrValue.setAttribute('parent',parentName); othera.setAttribute('parent',parentName); suba.setAttribute('parent',parentName); } del.onclick = function(){ var parent = this.parentNode; parent.parentNode.removeChild(parent) } _parent.appendChild(frag); othera.onclick = function(){ var level = this.getAttribute('level'); createAttr(level,this); }; suba.onclick = function(){ var level = parseInt(this.getAttribute('level')); var parent = this.parentNode; var valueinput = parent.getElementsByTagName('input')[1]; if(valueinput.type!='checkbox'){ var tip = d.createTextNode('数组'); parent.insertBefore(tip,valueinput); var checkbox = valueinput.cloneNode(); checkbox.type = 'checkbox'; parent.insertBefore(checkbox,tip); parent.removeChild(valueinput); } createAttr(level + 1,this,true); } } function init(){ var key1 = $('first_other').getAttribute('self'); $('first_other').onclick = function(){ var level = this.getAttribute('level'); createAttr(level,this); } var now = (new Date()).getTime() $('first_other').setAttribute('self','name'+now); $('first_sub').setAttribute('self','name'+now); $('first_pname').setAttribute('self','name'+now); $('first_pvalue').setAttribute('self','name'+now); $('first_sub').onclick = function(){ var level = parseInt(this.getAttribute('level')); var parent = this.parentNode; var valueinput = parent.getElementsByTagName('input')[1]; if(valueinput.type!='checkbox'){ var tip = d.createTextNode('数组'); parent.insertBefore(tip,valueinput); var checkbox = valueinput.cloneNode(); checkbox.type = 'checkbox'; parent.insertBefore(checkbox,tip); parent.removeChild(valueinput); } createAttr(level + 1,this,true); var self = this.getAttribute('self'); sour[self] = {}; } } init(); function gettype(obj){ return Object.prototype.toString.call(obj); } $('show').onclick = function(){ var nameinputs = document.getElementsByName('pname'); var valueinputs = document.getElementsByName('pvalue'); var len = nameinputs.length; var ip,vip; var arr = [],objarr = {}; for(var i=0;i<len;i++){ ip = nameinputs[i],vip = valueinputs[i]; var parent = ip.getAttribute('parent'); parent = (parent==null || parent==undefined || parent=='null') ? '' : parent; var _k = ip.value,_v = vip.type=='checkbox' ? (vip.checked ? [] : {}) :vip.value,_id = ip.getAttribute('self'); var level = parseInt(ip.getAttribute('level')) objarr[_id] = { id:_id, key:_k, value : _v, p : parent, level : level } } for(var p in objarr){ if(objarr[p].p){ var pid = objarr[p].p; var selfid = objarr[p].id; if(gettype(objarr[pid].value)=='[object Object]'){ objarr[pid].value[selfid] = objarr[p]; }else if(gettype(objarr[pid].value)=='[object Array]'){ objarr[pid].value.push(objarr[p]); }else{ } } } var _final = {}; for(var p in objarr){ if(objarr[p].level == 1){ createObj(objarr[p],_final); } } function createObj(obj,who){ var _type = gettype(obj.value); if(_type=='[object Object]'){ if(gettype(who) == '[object Array]'){ var len = who.length; who[len] = {}; for(var p in obj.value){ createObj(obj.value[p],who[len]); } }else{ !who[obj.key] && (who[obj.key] = {}); for(var p in obj.value){ createObj(obj.value[p],who[obj.key]); } } }else if(_type=='[object Array]'){ if(obj.key!=''){ !who[obj.key] && (who[obj.key] = []); }else{ if(gettype(who)=='[object Array]'||gettype(who)=='[object Object]'){ alert('有子字段且子字段为数组的字段名不得为空!'); return; } } for(var i=0,len=obj.value.length;i<len;i++){ if(obj.key==''){ createObj(obj.value[i],who[who.length-1]); }else{ if(obj.value[i].key!=''){ var thisobj = {}; who[obj.key].push(thisobj); createObj(obj.value[i],thisobj); }else{ createObj(obj.value[i],who[obj.key]); } } } }else{ if(obj.key!=''){ if(gettype(who) == '[object Array]'){ var thisobj = {}; thisobj[obj.key] = obj.value; who.push(thisobj) }else{ who[obj.key] = obj.value; } }else{ obj.value!= '' && who.push(obj.value); } } } $('result').innerHTML = JSON.stringify(_final) _final = {}; } $('read').onclick = function(){ var json = { a:1, b:{ o1:1, o2:2 }, c:[{v1:1,v2:2},{v3:3,v4:4}], d:[1,2,3,4] } $('container').innerHTML = ''; jsonToKV(json); } } </script></body></html>写的很乱,但功能实现了。凑合用吧。。回头有时间再重构下。读取JSON重点在read按钮的事件里,我是直接写死了一个类JOSN的object,你可以通过AJAX去取到你从文件里读取出来的JSON字符串。 哦,读取JSON后生成的同跟子没有添加事件。把createDomTree函数改成一下内容即可 function createDomTree(id,obj){ var parentDom = obj.parent ? getElementsByClassName('sub_child',$(obj.parent))[0] : $('container'); var frag = d.createDocumentFragment(); var div = d.createElement('div'); div.id = id; var othera = d.createElement('a'); othera.href="javascript:void(0)"; othera.setAttribute('level',obj.level); othera.innerHTML = '同' othera.setAttribute('self',id); obj.parent && othera.setAttribute('parent',obj.parent); var suba = othera.cloneNode(); suba.innerHTML = '子'; suba.className = 'sub'; var attrName = d.createElement('input'); attrName.name = 'pname'; attrName.type = 'text'; attrName.setAttribute('self',id); attrName.value = (typeof obj.key != 'number') ? obj.key : ''; attrName.setAttribute('level',obj.level); obj.parent && attrName.setAttribute('parent',obj.parent); var split = d.createTextNode(':'); var attrValue = attrName.cloneNode(); attrValue.name = 'pvalue'; attrValue.setAttribute('level',obj.level); if(gettype(obj.value)=='[object Object]'){ attrValue.type = 'checkbox' attrValue.checked= false; }else if(gettype(obj.value)=='[object Array]'){ attrValue.type = 'checkbox'; attrValue.checked= true; }else{ attrValue.value = obj.value; } var subcon = d.createElement('div') subcon.className= 'sub_child' var del = othera.cloneNode(); del.innerHTML = '删'; div.appendChild(othera); div.appendChild(suba); div.appendChild(attrName); div.appendChild(split); div.appendChild(attrValue); div.appendChild(del); div.appendChild(subcon); frag.appendChild(div); parentDom.appendChild(frag); del.onclick = function(){ var parent = this.parentNode; parent.parentNode.removeChild(parent) } othera.onclick = function(){ var level = this.getAttribute('level'); createAttr(level,this); }; suba.onclick = function(){ var level = parseInt(this.getAttribute('level')); var parent = this.parentNode; var valueinput = parent.getElementsByTagName('input')[1]; if(valueinput.type!='checkbox'){ var tip = d.createTextNode('数组'); parent.insertBefore(tip,valueinput); var checkbox = valueinput.cloneNode(); checkbox.type = 'checkbox'; parent.insertBefore(checkbox,tip); parent.removeChild(valueinput); } createAttr(level + 1,this,true); } } 在此页上的ActiveX控件和本页上的其它部分的交互可能不安全。你想允许这种交互吗? 关于input 标签里的文本选中问题 如何用js控制生成表格列的宽度 有朋友能帮忙写个屏蔽复制粘贴的JS么? [高手帮帮忙!!]js字符串截取,获取用"<-","->"括起来的字符串。 怎样在网页中一些部分禁用JavaScript代码,而其它部分正常运行! 如何让网页象QQ一样在屏幕边缘自动收缩,展开~ 網頁如何防止復制? 终于熬出一个星来了,散分散分!!! iframe 在IE中布局变形 一个简单的语法问题 jquery.validate remote
Response.AddHeader("Content-Disposition", "attachment;filename=\"xxx.txt\"");
Response.Write(Request.Form["txt"]);//输出提交的内容
Response.End();HTML模型
<script>
function readContent(ifr) {
document.getElementById('txt').value = ifr.contentWindow.document.body.innerHTML;
}
</script>
<iframe name="readifr" onload="readContent(this)" style="display:none"></iframe>
<!---选择文件后自动提交表单,xxxread.jsp负责获取文件内容并且输出--->
<form target="readifr" method="post" action="xxxread.jsp" enctype="multipart/form-data">
选择文件:<input type="file" name="fntxt" onchange="this.form.submit()"/>
</form><!---xxxsave.jsp负责获取提交的内容,设置响应头并且输出--->
<iframe name="saveifr" style="display:none"></iframe>
<form target="ifr" method="post" action="xxxsave.jsp">
<textarea rows="5" cols="50" name="txt" id="txt"></textarea><input type="submit" value="保存" />
</form>
把读出的json部分在js里转换成js对象
之后操作这个对象的属性后转回json再用io流写入txt试试
有键位名,键位值,键位的level,键位的父节点。[
{id:1,parent:0,key:'user',value:''},
{id:2,parent:1,key:'name',value:'test'},
{id:3,parent:1,key:'age',value:'18'},
{id:4,parent:1,key:'dress',value:[]},
{id:5,parent:4,key:'Tshirt',value:'aa'},
{id:6,parent:4,key:'shoe',value:'bb'},
]
以上的数组可以解析成
{
"user" : {
"name": "test",
"age" : '18',
"dress" : [
{"Tshirt" : "aa"},
{"shoe" : "bb"},
]
}
}不知道你理解没。
不知道你明白不
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>JSON生成</title>
<style>
.sub{
margin-left:5px;
}
div{position:relative;}
.sub_child{
margin-left:20px;
}
</style>
</head>
<body>
<div id="container">
<div>
<a href="javascript:void(0)" class="other" self="first_other" id="first_other" level="1">同</a><a self="first_sub" level="1" href="javascript:void(0)" id="first_sub" class="sub">子</a><input self="first_other" type="text" name="pname" level="1" id="first_pname">:<input self="first_sub" level="1" type="text" name="pvalue" id="first_pvalue"/>
<div class="sub_child"></div>
</div>
</div>
<input value="显示JSON" type="button" id="show" />
<input value="读取JSON" type="button" id="read" />
<div id="result"></div>
<script type="text/javascript">
function $(id){
return document.getElementById(id);
}
function getElementsByClassName(className, element) {
var children = (element || document).getElementsByTagName('*');
var elements = new Array();
for (var i = 0; i < children.length; i++) {
var child = children[i];
var classNames = child.className.split(' ');
for (var j = 0; j < classNames.length; j++) {
if (classNames[j] == className) {
elements.push(child);
break;
}
}
}
return elements;
}
var obj = {},sour = {};
window.onload = function(){
var d = document,container = $('container'); function jsonToKV(json){
var jsonObj = {};
function cutJson(json,key,par,level){
var name;
while(jsonObj[name]){
name = 'name'+(new Date()).getTime();
}
level = level || 0;
jsonObj[name] = {};
jsonObj[name].value = json;
jsonObj[name].key = key;
jsonObj[name].level = level;
par && (jsonObj[name].parent = par);
if(gettype(json)=='[object Object]'){
level++
for(var p in json){
cutJson(json[p],p,name,level);
}
}else if(gettype(json)=='[object Array]'){
level++
for(var i=0,len=json.length;i<len;i++){
cutJson(json[i],i,name,level);
}
}
}
cutJson(json);
for(var p in jsonObj){
if(p!=='undefined')
createDomTree(p,jsonObj[p]);
}
return jsonObj;
}
function createDomTree(id,obj){
var parentDom = obj.parent ? getElementsByClassName('sub_child',$(obj.parent))[0] : $('container');
var frag = d.createDocumentFragment();
var div = d.createElement('div');
div.id = id;
var othera = d.createElement('a');
othera.href="javascript:void(0)";
othera.setAttribute('level',obj.level);
othera.innerHTML = '同'
othera.setAttribute('self',id);
obj.parent && othera.setAttribute('parent',obj.parent);
var suba = othera.cloneNode();
suba.innerHTML = '子';
suba.className = 'sub';
var attrName = d.createElement('input');
attrName.name = 'pname';
attrName.type = 'text';
attrName.setAttribute('self',id);
attrName.value = (typeof obj.key != 'number') ? obj.key : '';
attrName.setAttribute('level',obj.level);
obj.parent && attrName.setAttribute('parent',obj.parent);
var split = d.createTextNode(':');
var attrValue = attrName.cloneNode();
attrValue.name = 'pvalue';
attrValue.setAttribute('level',obj.level);
if(gettype(obj.value)=='[object Object]'){
attrValue.type = 'checkbox'
attrValue.checked= false;
}else if(gettype(obj.value)=='[object Array]'){
attrValue.type = 'checkbox';
attrValue.checked= true;
}else{
attrValue.value = obj.value;
}
var subcon = d.createElement('div')
subcon.className= 'sub_child'
var del = othera.cloneNode();
del.innerHTML = '删';
div.appendChild(othera);
div.appendChild(suba);
div.appendChild(attrName);
div.appendChild(split);
div.appendChild(attrValue);
div.appendChild(del);
div.appendChild(subcon);
frag.appendChild(div);
parentDom.appendChild(frag);
}
function createAttr(level,who,sub){
var now = (new Date()).getTime();
var self = 'name'+now;
var _parent = level==1 ? container : (!sub ? who.parentNode.parentNode : getElementsByClassName('sub_child',who.parentNode)[0]);
var frag = d.createDocumentFragment();
var con = d.createElement('div');
var othera = d.createElement('a');
othera.href="javascript:void(0)";
othera.setAttribute('level',level);
othera.innerHTML = '同'
othera.setAttribute('self',self);
var suba = othera.cloneNode();
suba.innerHTML = '子';
suba.className = 'sub';
var attrName = d.createElement('input');
attrName.name = 'pname';
attrName.type = 'text';
attrName.setAttribute('self',self)
var attrValue = attrName.cloneNode();
attrValue.name = 'pvalue';
attrValue.type = 'text';
attrName.setAttribute('self','name'+now);
attrValue.setAttribute('self','name'+now);
attrName.setAttribute('level',level);
attrValue.setAttribute('level',level);
con.appendChild(othera);
con.appendChild(suba);
con.appendChild(attrName);
var split = d.createTextNode(':');
var subcon = d.createElement('div')
subcon.className= 'sub_child'
con.appendChild(split);
con.appendChild(attrValue);
var del = othera.cloneNode();
del.innerHTML = '删';
con.appendChild(del);
con.appendChild(subcon);
frag.appendChild(con);
if(who){
var parentName = sub ? who.getAttribute('self') : who.getAttribute('parent');
attrName.setAttribute('parent',parentName);
attrValue.setAttribute('parent',parentName);
othera.setAttribute('parent',parentName);
suba.setAttribute('parent',parentName);
}
del.onclick = function(){
var parent = this.parentNode;
parent.parentNode.removeChild(parent)
}
_parent.appendChild(frag);
othera.onclick = function(){
var level = this.getAttribute('level');
createAttr(level,this);
};
suba.onclick = function(){
var level = parseInt(this.getAttribute('level'));
var parent = this.parentNode;
var valueinput = parent.getElementsByTagName('input')[1];
if(valueinput.type!='checkbox'){
var tip = d.createTextNode('数组');
parent.insertBefore(tip,valueinput);
var checkbox = valueinput.cloneNode();
checkbox.type = 'checkbox';
parent.insertBefore(checkbox,tip);
parent.removeChild(valueinput);
}
createAttr(level + 1,this,true);
}
}
function init(){
var key1 = $('first_other').getAttribute('self');
$('first_other').onclick = function(){
var level = this.getAttribute('level');
createAttr(level,this);
}
var now = (new Date()).getTime()
$('first_other').setAttribute('self','name'+now);
$('first_sub').setAttribute('self','name'+now);
$('first_pname').setAttribute('self','name'+now);
$('first_pvalue').setAttribute('self','name'+now);
$('first_sub').onclick = function(){
var level = parseInt(this.getAttribute('level'));
var parent = this.parentNode;
var valueinput = parent.getElementsByTagName('input')[1];
if(valueinput.type!='checkbox'){
var tip = d.createTextNode('数组');
parent.insertBefore(tip,valueinput);
var checkbox = valueinput.cloneNode();
checkbox.type = 'checkbox';
parent.insertBefore(checkbox,tip);
parent.removeChild(valueinput);
}
createAttr(level + 1,this,true);
var self = this.getAttribute('self');
sour[self] = {};
}
}
init();
function gettype(obj){
return Object.prototype.toString.call(obj);
}
$('show').onclick = function(){
var nameinputs = document.getElementsByName('pname');
var valueinputs = document.getElementsByName('pvalue');
var len = nameinputs.length;
var ip,vip;
var arr = [],objarr = {};
for(var i=0;i<len;i++){
ip = nameinputs[i],vip = valueinputs[i];
var parent = ip.getAttribute('parent');
parent = (parent==null || parent==undefined || parent=='null') ? '' : parent;
var _k = ip.value,_v = vip.type=='checkbox' ? (vip.checked ? [] : {}) :vip.value,_id = ip.getAttribute('self');
var level = parseInt(ip.getAttribute('level'))
objarr[_id] = {
id:_id,
key:_k,
value : _v,
p : parent,
level : level
}
}
for(var p in objarr){
if(objarr[p].p){
var pid = objarr[p].p;
var selfid = objarr[p].id;
if(gettype(objarr[pid].value)=='[object Object]'){
objarr[pid].value[selfid] = objarr[p];
}else if(gettype(objarr[pid].value)=='[object Array]'){
objarr[pid].value.push(objarr[p]);
}else{
}
}
}
var _final = {};
for(var p in objarr){
if(objarr[p].level == 1){
createObj(objarr[p],_final);
}
}
function createObj(obj,who){
var _type = gettype(obj.value);
if(_type=='[object Object]'){
if(gettype(who) == '[object Array]'){
var len = who.length;
who[len] = {};
for(var p in obj.value){
createObj(obj.value[p],who[len]);
}
}else{
!who[obj.key] && (who[obj.key] = {});
for(var p in obj.value){
createObj(obj.value[p],who[obj.key]);
}
} }else if(_type=='[object Array]'){
if(obj.key!=''){
!who[obj.key] && (who[obj.key] = []);
}else{
if(gettype(who)=='[object Array]'||gettype(who)=='[object Object]'){
alert('有子字段且子字段为数组的字段名不得为空!');
return;
}
}
for(var i=0,len=obj.value.length;i<len;i++){
if(obj.key==''){
createObj(obj.value[i],who[who.length-1]);
}else{
if(obj.value[i].key!=''){
var thisobj = {};
who[obj.key].push(thisobj);
createObj(obj.value[i],thisobj);
}else{
createObj(obj.value[i],who[obj.key]);
}
}
}
}else{
if(obj.key!=''){
if(gettype(who) == '[object Array]'){
var thisobj = {};
thisobj[obj.key] = obj.value;
who.push(thisobj)
}else{
who[obj.key] = obj.value;
}
}else{
obj.value!= '' && who.push(obj.value);
}
}
}
$('result').innerHTML = JSON.stringify(_final)
_final = {};
}
$('read').onclick = function(){
var json = {
a:1,
b:{
o1:1,
o2:2
},
c:[{v1:1,v2:2},{v3:3,v4:4}],
d:[1,2,3,4]
}
$('container').innerHTML = '';
jsonToKV(json);
}
}
</script>
</body>
</html>
写的很乱,但功能实现了。凑合用吧。。回头有时间再重构下。读取JSON重点在read按钮的事件里,我是直接写死了一个类JOSN的object,你可以通过AJAX去取到你从文件里读取出来的JSON字符串。
把createDomTree函数改成一下内容即可
function createDomTree(id,obj){
var parentDom = obj.parent ? getElementsByClassName('sub_child',$(obj.parent))[0] : $('container');
var frag = d.createDocumentFragment();
var div = d.createElement('div');
div.id = id;
var othera = d.createElement('a');
othera.href="javascript:void(0)";
othera.setAttribute('level',obj.level);
othera.innerHTML = '同'
othera.setAttribute('self',id);
obj.parent && othera.setAttribute('parent',obj.parent);
var suba = othera.cloneNode();
suba.innerHTML = '子';
suba.className = 'sub';
var attrName = d.createElement('input');
attrName.name = 'pname';
attrName.type = 'text';
attrName.setAttribute('self',id);
attrName.value = (typeof obj.key != 'number') ? obj.key : '';
attrName.setAttribute('level',obj.level);
obj.parent && attrName.setAttribute('parent',obj.parent);
var split = d.createTextNode(':');
var attrValue = attrName.cloneNode();
attrValue.name = 'pvalue';
attrValue.setAttribute('level',obj.level);
if(gettype(obj.value)=='[object Object]'){
attrValue.type = 'checkbox'
attrValue.checked= false;
}else if(gettype(obj.value)=='[object Array]'){
attrValue.type = 'checkbox';
attrValue.checked= true;
}else{
attrValue.value = obj.value;
}
var subcon = d.createElement('div')
subcon.className= 'sub_child'
var del = othera.cloneNode();
del.innerHTML = '删';
div.appendChild(othera);
div.appendChild(suba);
div.appendChild(attrName);
div.appendChild(split);
div.appendChild(attrValue);
div.appendChild(del);
div.appendChild(subcon);
frag.appendChild(div);
parentDom.appendChild(frag);
del.onclick = function(){
var parent = this.parentNode;
parent.parentNode.removeChild(parent)
}
othera.onclick = function(){
var level = this.getAttribute('level');
createAttr(level,this);
};
suba.onclick = function(){
var level = parseInt(this.getAttribute('level'));
var parent = this.parentNode;
var valueinput = parent.getElementsByTagName('input')[1];
if(valueinput.type!='checkbox'){
var tip = d.createTextNode('数组');
parent.insertBefore(tip,valueinput);
var checkbox = valueinput.cloneNode();
checkbox.type = 'checkbox';
parent.insertBefore(checkbox,tip);
parent.removeChild(valueinput);
}
createAttr(level + 1,this,true);
}
}