javascript表单域与json数据间的交互第1/3页

 更新时间:2008年10月16日 23:08:27   作者:  
找了几个javascript的框架,都没有找到我想要的: 提供函数,把某个表单的所有域封装成json数据格式的对象,唯有自己实现一个。
包括对象中有集合属性、对象中引用其他对象属性:
复制代码 代码如下:

/**
**json对象数据设置到表单域中
*/
function jsonObjectToForm(form, jsonObject){
    for(i = 0, max = form.elements.length; i < max; i++) {
        e = form.elements[i];
        eName = e.name;
        if(eName.indexOf('.') > 0){
            dotIndex = eName.indexOf('.');
            parentName = eName.substring(0, dotIndex);
            childName = eName.substring(dotIndex+1);
            //迭代判断eName,组装成json数据结构
            eValue = iterValueFromJsonObject(jsonObject, parentName, childName);
        }else{
            eValue = jsonObject[eName];
        }
        if(eValue && eValue != "undefined" && eValue != "null"){
            switch(e.type){
                case 'checkbox':
                case 'radio':
                    if(e.value == eValue){
                        e.checked = true;
                    }
                    break;
                case 'hidden':
                case 'password':
                case 'textarea':
                case 'text':
                    e.value = eValue;
                    break;
                case 'select-one':
                case 'select-multiple':
                    for(j = 0; j < e.options.length; j++){
                        op = e.options[j];
                        //alert("eName : " + eName + "; op value : " + op.value + "; eValue : " + eValue);
                        if(op.value == eValue){
                            op.selected = true;
                        }
                    }
                    break;
                case 'button':
                case 'file':
                case 'image':
                case 'reset':
                case 'submit':
                default:
            }
        }
    }
}

/**
* json数组读写有两种方式
* 1: a.bs[0].id
* 2: a["bs"][0]["id"]
* 把表单转换成json数据格式
*/
function formToJsonObject(form){
    var jsonObject = {};
    for(i = 0, max = form.elements.length; i < max; i++) {
        e = form.elements[i];
        em = new Array();
        if(e.type == 'select-multiple'){
            for(j = 0; j < e.options.length; j++){
                op = e.options[j];
                if(op.selected){
                    em[em.length] = op.value;
                }
            }
        }
        switch(e.type){
            case 'checkbox':
            case 'radio':
                if (!e.checked) { break; }
            case 'hidden':
            case 'password':
            case 'select-one':
            case 'select-multiple':
            case 'textarea':
            case 'text':
                eName = e.name;
                if(e.type == 'select-multiple'){
                    eValue = em;
                }else{
                    eValue = e.value.replace(new RegExp('(["\\\\])', 'g'), '\\$1');
                }
                //判断是否是对象类型数据
                if(eName.indexOf('.') > 0){
                    dotIndex = eName.indexOf('.');
                    parentName = eName.substring(0, dotIndex);
                    childName = eName.substring(dotIndex+1);
                    //迭代判断eName,组装成json数据结构
                    iterJsonObject(jsonObject, parentName, childName, eValue);
                }else{
                    jsonObject[eName] = eValue;
                }
                break;
            case 'button':
            case 'file':
            case 'image':
            case 'reset':
            case 'submit':
            default:
        }
    }
    return jsonObject;
}

/**
* 把表单元素迭代转换成json数据
*/
function iterJsonObject(jsonObject, parentName, childName, eValue){
    //pArrayIndex用于判断元素是否是数组标示
    pArrayIndex = parentName.indexOf('[');
    //判断是否集合数据,不是则只是对象属性
    if(pArrayIndex < 0){
        var child = jsonObject[parentName];
        if(!child){
            jsonObject[parentName] = {};
        }
        dotIndex = childName.indexOf('.');
        if(dotIndex > 0){
            iterJsonObject(jsonObject[parentName], childName.substring(0, dotIndex), childName.substring(dotIndex+1), eValue);
        }else{
            jsonObject[parentName][childName] = eValue;
        }
    }else{
        pArray = jsonObject[parentName.substring(0, pArrayIndex)];
        //若不存在js数组,则初始化一个数组类型
        if(!pArray){
            jsonObject[parentName.substring(0, pArrayIndex)] = new Array();
        }
        //取得集合下标,并判断对应下标是否存在js对象
        arrayIndex = parentName.substring(pArrayIndex+1, parentName.length-1);
        var c = jsonObject[parentName.substring(0, pArrayIndex)][arrayIndex];
        if(!c){
            jsonObject[parentName.substring(0, pArrayIndex)][arrayIndex] = {};
        }
        dotIndex = childName.indexOf('.');
        if(dotIndex > 0){
            iterJsonObject(jsonObject[parentName.substring(0, pArrayIndex)][arrayIndex], childName.substring(0, dotIndex), childName.substring(dotIndex+1), eValue);
        }else{
            jsonObject[parentName.substring(0, pArrayIndex)][arrayIndex][childName] = eValue;
        }
    }
}

/**
* 迭代json数据对象设置到表单域中
*/
function iterValueFromJsonObject(jsonObject, parentName, childName){
    //pArrayIndex用于判断元素是否是数组标示
    pArrayIndex = parentName.indexOf('[');
    //判断是否集合数据,不是则只是对象属性
    if(pArrayIndex < 0){
        dotIndex = childName.indexOf('.');
        if(dotIndex > 0){
            return iterValueFromJsonObject(jsonObject[parentName], childName.substring(0, dotIndex), childName.substring(dotIndex+1));
        }else{
            return jsonObject[parentName][childName]
        }
    }else{
        pArray = jsonObject[parentName.substring(0, pArrayIndex)];
        //取得集合下标,并判断对应下标是否存在js对象
        arrayIndex = parentName.substring(pArrayIndex+1, parentName.length-1);
        var c = jsonObject[parentName.substring(0, pArrayIndex)][arrayIndex];
        dotIndex = childName.indexOf('.');
        if(dotIndex > 0){
            return iterValueFromJsonObject(jsonObject[parentName.substring(0, pArrayIndex)][arrayIndex], childName.substring(0, dotIndex), childName.substring(dotIndex+1));
        }else{
            return jsonObject[parentName.substring(0, pArrayIndex)][arrayIndex][childName]
        }
    }
}

相关文章

  • js操作两个json数组合并、去重,以及删除某一项元素

    js操作两个json数组合并、去重,以及删除某一项元素

    这篇文章主要介绍了js操作两个json数组合并、去重,以及删除某一项元素,需要的朋友可以参考下
    2020-09-09
  • js解析与序列化json数据(一)json.stringify()的基本用法

    js解析与序列化json数据(一)json.stringify()的基本用法

    对象有两个方法:stringify()和parse()。在最简单的情况下,这两个方法分别用于把JavaScript对象序列化为JSON字符串和把JSON字符串解析为原生JavaScript
    2013-02-02
  • IE8 原生JSON支持

    IE8 原生JSON支持

    你可能已经从这篇文章的标题中猜到了,Internet Explorer 8(目前是Beta2)提供了原生JSON的解析和序列化。
    2009-04-04
  • 解读JSON的三种格式

    解读JSON的三种格式

    这篇文章主要介绍了解读JSON的三种格式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • json 介绍 js简单实例

    json 介绍 js简单实例

    json全称是JavaScript Object Notation(javaScript对象符号)。JSON是一种结构化的,轻量级的,完全独立于语言的.基于文本的数据传输格式,在许多场合下用来替代xml文件格式。
    2009-12-12
  • JSON相关知识汇总

    JSON相关知识汇总

    本文给大家汇总了一下关于json的相关的知识点,从基础到示例,非常全面,有需要的小伙伴可以参考下。
    2015-07-07
  • 半个小时学json(json传递示例)

    半个小时学json(json传递示例)

    这篇文章主要介绍了半个小时学json(json传递示例),主要包括一维数组与二维数组,需要的朋友可以参考下
    2016-12-12
  • JS中JSON.parse(JSON.stringify())实现深拷贝

    JS中JSON.parse(JSON.stringify())实现深拷贝

    深拷贝就是完全拷贝一份新的对象,本文主要介绍了JS中JSON.parse(JSON.stringify())实现深拷贝,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • 看了就知道什么是JSON

    看了就知道什么是JSON

    看了就知道什么是JSON...
    2007-12-12
  • 将nodejs打包工具整合到鼠标右键的方法

    将nodejs打包工具整合到鼠标右键的方法

    昨天放出了主要的nodejs打包代码(《nodejs写的简单项目打包工具》),今天放出整合到鼠标右键的代码,打包需要配置环境变量,添加NODE_PATH为node安装路径
    2013-05-05

最新评论