当前位置: 首页 > 面试题库 >

使用jQuery将复杂形式序列化为JSON对象

司空祯
2023-03-14
问题内容

我一直在寻找这个小时,却没有找到答案。在燃烧之前,请仔细阅读整个问题!:)

我有类似这样的表格:

<form id="sample">
 <input name="name" type="text" value="name value" />

 <input name="phone[0][type]" type="text" value="cell" />
 <input name="phone[0][number]" type="text" value="000" />

 <input name="phone[1][type]" type="text" value="home" />
 <input name="phone[1][number]" type="text" value="111" />
</form>

并且需要能够将其序列化为:

{
 name: 'name value',

 phone: [
  {
   type: 'cell',
   number: '000'
  },
  {
   type: 'home',
   number: '111'
  }
 ]
}

我在SO上尝试过大多数答案,包括jquery-json库,并且大多数返回如下所示:

{
 'name': 'name value',
 'phone[0][type]': 'cell',
 'phone[0][number]': '000',
 'phone[1][type]': 'home',
 'phone[1][number]': '111',
}

这是 我不能使用的 东西!:P

提前谢谢大家。


问题答案:

试试我为您编写的这段代码…仅使用您的数据结果,对我来说效果很好。您可以对其进行处理,并制作一个简单的jQuery插件…

该示例需要JSON.stringify才能正常工作。

var d = {
    'name': 'name value',
    'phone[0][type]': 'cell',
    'phone[0][number]': '000',
    'phone[1][type]': 'home',
    'phone[1][number]': '111',
};

$(document).ready(function(){

    arrangeJson(d);
    alert(JSON.stringify(d));
});

function arrangeJson(data){
    var initMatch = /^([a-z0-9]+?)\[/i;
    var first = /^\[[a-z0-9]+?\]/i;
    var isNumber = /^[0-9]$/;
    var bracers = /[\[\]]/g;
    var splitter = /\]\[|\[|\]/g;

    for(var key in data) {
        if(initMatch.test(key)){
            data[key.replace(initMatch,'[$1][')] = data[key];
        }
        else{
            data[key.replace(/^(.+)$/,'[$1]')] = data[key];
        }
        delete data[key];
    }


    for (var key in data) {
        processExpression(data, key, data[key]);
        delete data[key];
    }

    function processExpression(dataNode, key, value){
        var e = key.split(splitter);
        if(e){
            var e2 =[];
            for (var i = 0; i < e.length; i++) {
                    if(e[i]!==''){e2.push(e[i]);} 
            }
            e = e2;
            if(e.length > 1){
                var x = e[0];
                var target = dataNode[x];
                if(!target){
                    if(isNumber.test(e[1])){
                        dataNode[x] = [];
                    }
                    else{
                        dataNode[x] ={}
                    }
                }
                processExpression(dataNode[x], key.replace(first,''), value);
            }
            else if(e.length == 1){
                dataNode[e[0]] = value;
            }
            else{
                alert('This should not happen...');
            }
        }
    }
}


 类似资料:
  • 问题内容: 说我有以下对象: 显然,当我向杰克逊请求JSON时,我得到如下信息: 但是,我对QueryString的需求是将顶级属性对转换为Key = Value&格式,因此类似: 当然还有MyPerson = [This_Part_Needs_To_Be_Url_Encoded]。 杰克逊中有任何通用方法会自动为我执行此操作吗?还是我会被迫提出自己的想法?一些字符串替换正则表达式?有任何想法吗?

  • 这个json对象有时可能非常非常大,我想用GSON解析它,但我不太明白我的java对象的格式应该如何解析它们。 真正的肉在键中,第二个键是JSONArray。每个索引包含一个对象,每个对象可以包含一个键,该键也是一个json数组,在某些情况下可以包含json数组。 我有所有这些的模型,有不同的解析范式,但没有GSON的模型。由于内存限制,我现在需要使用GSON

  • 问题内容: 如何在JavaScript中将对象序列化为JSON? 问题答案: 您正在寻找。

  • 问题内容: 我的JSON有点弱,所以我需要一些帮助。 我正在尝试反序列化用户的JSON: 放入我用属性装饰的对象中: 我得到以下异常: Newtonsoft.Json.JsonSerializationException:在JSON中找不到必需的属性’user_id’。 这是因为JSON对象是一个数组吗?如果是这样,如何将其反序列化为一个User对象? 提前致谢! 问题答案: 正如Alexandr

  • 我试图找到一种通过json和spring mvc 3.1传递复杂对象的方法。我也在使用knockoutjs,所以将ko.tojson等效为json.stringify。 部署 以下是ajax调用: spring控制器代码如下所示: 使用适当的公共getter/setter。 当我尝试进行这个调用时,我得到一个错误400客户机发送的请求语法不正确()。 复杂对象都是通过json get早些时候获得的

  • 问题内容: 因此,当我偶然发现新的JsonSerializable Interface 时,我在php.net上四处徘徊,以获取有关将PHP对象序列化为JSON的信息。它只是 PHP > = 5.4,而我正在5.3.x环境中运行。 PHP <5.4如何实现这种功能? 我还没有使用JSON进行很多工作,但是我试图在应用程序中支持API层,并且将数据对象( 否则将发送到视图 )转储到JSON中将是完美