简体   繁体   English

如何基于JavaScript中的HTML输入创建JSON?

[英]How to create a JSON based on HTML inputs in JavaScript?

I am having some trouble creating a multi dimension json based on multiple html form inputs: 我在基于多个html表单输入创建多维json时遇到了一些麻烦:

the html inputs: html输入:

<div class="form-group-attached m-b-10">
<div class="form-group form-group-default input-group required">
<div class="form-input-group">
<label for="title">title</label>                      
<input type="text" name="title" value="some title" class="form-control">
</div>
</div>
</div>
<div class="form-group-attached m-b-10">
<div class="form-group form-group-default input-group required">
<div class="tile-icon input-group-addon d-flex">
<i class="fa-2x fa-color far fa-image"></i>                    </div>
<div class="form-input-group">
<label for="image">Image URL</label>                      
<input type="text" name="image" value="some image url" class="form-control">
</div>
</div>
<div class="form-group form-group-default input-group required">
<div class="tile-icon input-group-addon d-flex">
<i class="fa-2x fa-color far fa-link"></i>                    </div>
<div class="form-input-group">
<label for="link">Link URL</label>                      
<input type="text" name="link" value="http://www.google.com" class="form-control">
</div>
</div>
</div>

Here is the javascript code: 这是JavaScript代码:

var frmData = {};
$(':input').each(function(){   
   frmData[$(this).attr('name')] = $(this).val();
});
alert(JSON.stringify(frmData));

Here is the json what I am getting: 这是我得到的json:

{"title":"some title","image":"some image url","link":"http://www.google.com"}

What I need instead is after 'title', I would like to create a data object and add everything else as an sub level of 'data' like so: 我需要的是在“标题”之后,我想创建一个数据对象并将其他所有内容添加为“数据”的子级别,如下所示:

{"title":"some title","data":{"image":"some image url","link":"http://www.google.com"}}

any help is appreciated. 任何帮助表示赞赏。

thank, 谢谢,

Here is the way I would solve it: 这是我要解决的方法:

 var inputToJson = function() { var formData = {}; formData.data = {}; $('input').each(function( index ) { if($( this ).attr('name')=="title") { formData[$( this ).attr('name')] = $( this ).val(); } else { formData["data"][$(this).attr('name')] = $( this ).val(); } }); return formData; } console.log(inputToJson()); 
 <script src="https://code.jquery.com/jquery-3.1.0.js"></script><div class="form-group-attached mb-10"> <div class="form-group form-group-default input-group required"> <div class="form-input-group"> <label for="title">title</label> <input type="text" name="title" value="some title" class="form-control"> </div> </div> </div> <div class="form-group-attached mb-10"> <div class="form-group form-group-default input-group required"> <div class="tile-icon input-group-addon d-flex"> <i class="fa-2x fa-color far fa-image"></i> </div> <div class="form-input-group"> <label for="image">Image URL</label> <input type="text" name="image" value="some image url" class="form-control"> </div> </div> <div class="form-group form-group-default input-group required"> <div class="tile-icon input-group-addon d-flex"> <i class="fa-2x fa-color far fa-link"></i> </div> <div class="form-input-group"> <label for="link">Link URL</label> <input type="text" name="link" value="http://www.google.com" class="form-control"> </div> </div> </div> 

It's important to note that the proper way to access data from a form is using .serialize() on the actual element but given the special requirement of augmenting parts of the form within a custom "data" object that approach would also require additional manipulation. 重要的是要注意,从表单访问数据的正确方法是在实际元素上使用.serialize(),但是鉴于特殊的要求,即在自定义“数据”对象内扩展表单的某些部分的特殊要求,这种方法也需要进行其他操作。

JSBIN DEMO JSBIN演示

The code below gives the output that you want. 下面的代码提供所需的输出。 Just go through that. 只是经历一下。

 var frmData = {}; var frmDataImageArray = []; var frmDataTitle; var frmDataImage; var frmDataLink; $(':input').each(function(){ if($(this).attr('name')=='image') frmDataImage=$(this).val(); else if($(this).attr('name')=='link') { //Here i assume that link is the last control in this form that's why i put this code here. So that title and image is fetched before entering into this statement frmDataLink=$(this).val(); frmDataImageArray.push({"Image":frmDataImage,"Link":frmDataLink}); //frmData={"title":frmDataTitle,"Data":{"Image":frmDataImage,"Link":frmDataLink}}; } else frmDataTitle=$(this).val(); //frmData[$(this).attr('name')] = $(this).val(); }); frmData={"title":frmDataTitle,"Data":frmDataImageArray}; console.log(JSON.stringify(frmData)); 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="form-group-attached mb-10"> <div class="form-group form-group-default input-group required"> <div class="form-input-group"> <label for="title">title</label> <input type="text" name="title" value="some title" class="form-control"> </div> </div> </div> <div class="form-group-attached mb-10"> <div class="form-group form-group-default input-group required"> <div class="tile-icon input-group-addon d-flex"> <i class="fa-2x fa-color far fa-image"></i> </div> <div class="form-input-group"> <label for="image">Image URL</label> <input type="text" name="image" value="some image url" class="form-control"> </div> </div> <div class="form-group form-group-default input-group required"> <div class="tile-icon input-group-addon d-flex"> <i class="fa-2x fa-color far fa-link"></i> </div> <div class="form-input-group"> <label for="link">Link URL</label> <input type="text" name="link" value="http://www.google.com" class="form-control"> </div> </div> </div> 

 var arr = []; var frmData = {}; var Title; var Image; var Link; $(':input').each(function() { if ($(this).attr('name') == 'image') Image = $(this).val(); else if ($(this).attr('name') == 'link') { Link = $(this).val(); frmData = { "title": Title, "Data": { "Image": Image, "Link": Link } }; arr.push(frmData) } else Title = $(this).val(); }); console.log(JSON.stringify(frmData));//json format console.log(arr);//arr fomat 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="form-group-attached mb-10"> <div class="form-group form-group-default input-group required"> <div class="form-input-group"> <label for="title">title</label> <input type="text" name="title" value="some title" class="form-control"> </div> </div> </div> <div class="form-group-attached mb-10"> <div class="form-group form-group-default input-group required"> <div class="tile-icon input-group-addon d-flex"> <i class="fa-2x fa-color far fa-image"></i> </div> <div class="form-input-group"> <label for="image">Image URL</label> <input type="text" name="image" value="some image url" class="form-control"> </div> </div> <div class="form-group form-group-default input-group required"> <div class="tile-icon input-group-addon d-flex"> <i class="fa-2x fa-color far fa-link"></i> </div> <div class="form-input-group"> <label for="link">Link URL</label> <input type="text" name="link" value="http://www.google.com" class="form-control"> </div> </div> </div> <button id="generateJson">Generate Json</button> 

Maybe the solution is already in one of the previous answers, but as I am sitting in a train with nothing else to do I put together the following minimal solution: 也许解决方案已经在前面的答案中了,但是当我坐在火车上无事可做时,我整理了以下最小解决方案:

var jsn={data:{}};
$('input','form:first').each(function(i,o){
  var na=$(o).attr('name');
  (na=='title'?jsn:jsn.data)[na]=o.value;
});

This can go into the $(function( ... )} section or be triggered by some click event. I am currently treating all inputs within the first <form> element on the page. You can change that to suit your needs. 这可以进入$(function( ... )}部分,或者由某些click事件触发。我目前正在处理页面上第一个<form>元素内的所有输入。您可以根据需要进行更改。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM