将 json 对象转换为表单序列化数据

Posted

技术标签:

【中文标题】将 json 对象转换为表单序列化数据【英文标题】:Convert json object to form-serialized data 【发布时间】:2020-12-19 21:16:24 【问题描述】:

我有这个包含 html 的对象:

obj = 
   amount: 0
   apply_business_delivery: "<div class="form-check"><input type="checkbox" checked class="form-check-input" name="apply_business_delivery" id="apply_business_delivery"></div>"
   apply_private_delivery: "<div class="form-check"><input type="checkbox" checked class="form-check-input" name="apply_private_delivery" id="apply_private_delivery"></div>"
   bin: "<i class="far fa-trash-alt"></i>"
   service: "E-mail advisering"
   unit: "<div class="form-group"><select class="form-control form-control-sm select2" name="units" id="units"><option selected>Kr.</option><option >%</option></select></div>"

我能否以某种方式将这些值转换为表单序列化数据,以便更轻松地使用服务器端?例如,复选框应转换为01(如果已选中)。

编辑: 想要我想要的是有一个像$('form').serializeArray() 一样的功能。我只是在弄清楚如何在 obj 上执行此操作时遇到问题。

例如 $('form').serializeArray() 转换这个 HTML:

<select class="form-control form-control-sm select2" name="company_name"
        id="company_name">
    <option>My company</option>
</select>
<select class="form-control form-control-sm select2" name="type"
        id="type">
    <option>Business</option>
</select>

到这里:

 "form" => array:2 [
    0 => array:2 [
      "name" => "company_name"
      "value" => "My company"
    ]
    1 => array:2 [
      "name" => "type"
      "value" => "Business"
    ]
  ]

这是我想要的结果:

obj = 
   amount: 0
   apply_business_delivery: [
      "name" => "apply_business_delivery"
      "value" => 1
   ]
   apply_private_delivery: [
      "name" => "apply_private_delivery"
      "value" => 1
   ]
   bin: ""
   service: "E-mail advisering"
   unit: [
      "name" => "units"
      "value" => "Kr."
   ]

【问题讨论】:

这能回答你的问题吗? Query-string encoding of a javascript Object @Ouroborus 它给了我这个:“0=%5Bobject%20Object%5D&1=%5Bobject%20Object%5D&2=%5Bobject%20Object%5D&3=%5Bobject%20Object%5D&4=%5Bobject%20Object %5D&5=%5Bobject%20Object%5D&6=%5Bobject%20Object%5D" 这不是我想要的结果。 @Unicco 你不需要使用encodeURIComponent(p),如果你不使用“%20”,只需使用p.toString()。它应该大部分时间都可以工作。 @DominiqueFortin 嗯,它仍然不能像 serializeArray 那样很好地转换我的 HTML 标签。查看我更新的问题。 @Unicco 表单序列化格式用于 html 表单元素。如果您有无法放入 html 表单的复杂数据,那么您的想法就错了。也许看看JSON.stringify 【参考方案1】:

这似乎对我有用

var res = $.fn.agGridSerializeRowData( gridFeeOptions.rowData );

/**
 *
 * @param agGridOption
 * @returns []
 */
$.fn.agGridGetAllData = function (agGridOption) 
    let rowData = [];
    agGridOption.api.forEachNode(node => rowData.push(node.data));
    return rowData;


/**
 *
 * @param rows
 * @returns []
 */
$.fn.agGridSerializeRowData = function (agGridOption) 
    let allFormsData = [];
    let rows = $.fn.agGridGetAllData(agGridOption);

    $.each(rows, function (i, rowObjects) 
        let obj = ;

        $.each(rowObjects, function (i, e) 
            if (/<\/?[a-z][\s\S]*>/i.test(e)) 
                obj[i] = $.fn.agGridSerializeHtml(e);
             else 
                obj[i] = e;
            
        );
        allFormsData.push(obj);
    );
    return allFormsData;
;

/**
 *
 * @param e
 * @returns 
 */
$.fn.agGridSerializeHtml = function( e ) 
    e = e || '';
    let allDataObject = ;
    let allHtmlDataTemp = ;

    if ( e !== '' ) 
        $( e ).find( 'input,select,textarea' ).each( function( i ) 
            allHtmlDataTemp[ i ] = $( this );
         );
     else 
        $( 'input,select,textarea' ).each( function( i ) 
            allHtmlDataTemp[ i ] = $( this );
         );
    

    $.each( allHtmlDataTemp, function( i ) 
        let $input = $( this );
        let eName;
        let eVal;

        if ( ($input.attr( 'type' ) === 'submit') ||
            ($input.attr( 'type' ) === 'button') ) 
            return true;
        

        if ( ($input.attr( 'name' ) !== undefined) && ($input.attr( 'name' ) !== '') ) 
            eName = $input.attr( 'name' ).trim();
         else if ( ($input.attr( 'id' ) !== undefined) && ($input.attr( 'id' ) !== '') ) 
            eName = $input.attr( 'id' ).trim();
         

        if ( $input.val() !== undefined ) 
            if ( ($input.attr( 'type' ) === 'radio') || ($input.attr( 'type' ) === 'checkbox') ) 
                eVal = $input.is(":checked");
             else 
                eVal = $input.val();
            
         else if ( $input.text() !== undefined ) 
            eVal = $input.text();
        

        if ( eVal === undefined || eVal == null ) 
            eVal = '';
        

        if ( eName !== undefined ) 
            let elementArr = [];
            if ( eName.indexOf( ' ' ) !== -1 ) 
                elementArr = eName.split( /(\s+)/ );
             else 
                elementArr.push( eName );
            

            $.each( elementArr, function( index, name ) 
                name = name.trim();
                if ( name !== '' ) 
                    allDataObject[ name ] = eVal;
                
             );
        
     );
    return allDataObject;
;

之前:

之后:

【讨论】:

以上是关于将 json 对象转换为表单序列化数据的主要内容,如果未能解决你的问题,请参考以下文章

jquery怎样把表单中的值转换成json对象

将表单数据数组对象转换为 JSON [重复]

将表单数据转换为 JSON 对象 [重复]

jQuery实现form表单序列化转换为json对象功能示例

Google Closure - 将数据表单数据转换为 json 对象

JSON转换和序列化的区别