Access911.net   |   a9BBS   |   OTaA System  
  搜索文章:  
Access911欢迎您光临  
   主页      上传      繁體版       论坛     
设为首页  |  加入收藏   
  
你现在的位置:文章索引 -> 文章分类 -> C#/.Net  
 首页|  近日更新|  下载  |  文章索引  |  搜索|  术语|  承接工程|  
 
系统正在加载内容,请耐心等待...
 
 查询
 窗体
 报表
 
 
 VBA
 函数
 ADO/DAO/ADO.NET
 API
 ADP
 安全
 发布
 OA
 ASP/ASP.NET
 其他语言
 控件
 DELPHI
 C#/.Net
 本站
 其他
 小例程
 常用软件
 参考文档
 业主作品
 网友大作
 
 
友情链接
 access911.net
 
访问人次
 1701840
 
站长 E-Mail
 net911@sina.com
 access911@gmail.com
 
RSS 订阅

显示附加信息 >>>

如何用js遍历json对象生成用于post提交的url字串?序列化JSON

作者:cg1  摘自:access911.net  :cg1  更新日期:2012-11-2  浏览人次:

 

问题:

如何用js遍历json对象生成用于post提交的url字串?序列化JSON《C#/.Net》
jQuery.Form中可以直接用Serialize将Form中所有的input序列化为可以用于URL GET 或者 POST 的字符串,类似 &a=1&b=2 这样的字符串。
如何让 json 对象序列化为类似的字符串呢?

 


回答:

json对象包含的层次可能非常多,因此直接序列化可能有点问题,主要是name可能有很多重复。可以用添加前缀的方式避免部分。或者干脆只取最终节点的数据。JS 代码如下:



//遍历对象,带级别前缀的。每个层次的前缀用英文逗号分隔。
function ergodicJson(obj, prefix) {
    var s = ""
    for (var itm in obj) {
        if (obj[itm] instanceof Array == true) {
            //是数组
            s += "&" + prefix + itm + "_count=" + obj[itm].length
            for (var i = 0; i < obj[itm].length; i++) {
                if (obj[itm][i] instanceof Array == true) {
                    s += ergodicJson(obj[itm][i], prefix + itm + ",");
                } else if (obj[itm][i] instanceof Object == true) {
                    s += ergodicJson(obj[itm][i], prefix + itm + ",");
                } else {
                    s += "&" + prefix + itm + "," + encodeURI(obj[itm][i]) + "=" + encodeURI(obj[itm][i]);
                }
                //s += ergodicJson(obj[itm][i]);
            }
        } else if (obj[itm] instanceof Object == true) {
            //是json对象。

            s += ergodicJson(obj[itm], prefix + itm + ",");
        }
        else {
            //是简单数值   
            s += "&" + prefix + encodeURI(itm) + "=" + encodeURI(obj[itm]);
        }
    }
    return s;
}


//只遍历最终项目,如果最终项目没有属性名,则以其值为属性名
function ergodicJson2(obj) {
    var s = ""
    for (var itm in obj) {
        if (obj[itm] instanceof Array == true) {
            //是数组
            s += "&" + itm + "_count=" + obj[itm].length
            for (var i = 0; i < obj[itm].length; i++) {
                if (obj[itm][i] instanceof Array == true) {
                    s += ergodicJson2(obj[itm][i]);
                } else if (obj[itm][i] instanceof Object == true) {
                    s += ergodicJson2(obj[itm][i]);
                } else {
                    s += "&" + encodeURI(obj[itm][i]) + "=" + encodeURI(obj[itm][i]);
                }
            }
        } else if (obj[itm] instanceof Object == true) {
            //是json对象。
            s += ergodicJson2(obj[itm]);
        }
        else {
            //是简单数值   
            s += "&" + encodeURI(itm) + "=" + encodeURI(obj[itm]);
        }
    }
    return s;
}


调用示例:
function runtest7() {
    var json =
        { a: "dasdf",
            b: 451,
            d: ["a", "b", "c"],
            e: [
                { e1: "dfa", e2: "dfasdf" },
                { e3: "sdfasdf", e4: "sdfasdf" },
                { e5: { e51: "dfasdf", e52: "sdfasd"} },
                { e6: ["sd", 23, "dfa"], e7: [{ e71: "sadfasdf" },
                                { e72: "sdfasd" }
                            ]
                }
            ]
        };

        var s = ergodicJson(json, ""); // "&a=dasdf&b=451&d_count=3&d,a=a&d,b=b&d,c=c&e_count=4&e,e1=dfa&e,e2=dfasdf&e,e3=sdfasdf&e,e4=sdfasdf&e,e5,e51=dfasdf&e,e5,e52=sdfasd&e,e6_count=3&e,e6,sd=sd&e,e6,23=23&e,e6,dfa=dfa&e,e7_count=2&e,e7,e71=sadfasdf&e,e7,e72=sdfasd"    
        var bs = ergodicJson2(json);     //"&a=dasdf&b=451&d_count=3&a=a&b=b&c=c&e_count=4&e1=dfa&e2=dfasdf&e3=sdfasdf&e4=sdfasdf&e51=dfasdf&e52=sdfasd&e6_count=3&sd=sd&23=23&dfa=dfa&e7_count=2&e71=sadfasdf&e72=sdfasd"    String
        var b = s;
}


 


本站文章旨在为该问题提供解决思路及关键性代码,并不能完成应该由网友自己完成的所有工作,请网友在仔细看文章并理解思路的基础上举一反三、灵活运用。

access911.net 原创文章,作者本人对文章保留一切权利。
如需转载必须征得作者同意并注明本站链接

 

 
相关文章
     没有手动相关文章
 
评论
     查看或发表更多的评论,请单击这里。
 
 
 
 
 
   
  Access911.net   |   a9BBS   |   OTaA System   |
建站日期:2000年4月2日  |  设计施工:陈格 ( access911 & cg1 )
 Copyright © 2000 - 2003 COMET, 陈格 保留所有权利