JSON数据ajax不是正确的POST数据

时间:2015-11-09 11:44:02

标签: php json ajax

我正在尝试在PHP中发布一些JSON数据。但是出了点问题。

这是我的HTML -

<tbody>
    {% for x in sets %}
        <tr class="">
            <td>
                <div class="form-group">
                    {% if x is defined %}{{x}}</div>{% else %}{% endif %}
            </td>
            <td><input type="number" class ="first" name ="first"></td>
            <td><input type="number" class ="second" name ="second"></td>
            <td><span id="txtData"></span></td>
        </tr>
    {% endfor %}
</tbody>

这是我的脚本

    <script>
    $(document).ready(function () {
        $("#scoreForm").on('submit', function (e) {
            $("#submit").show();
            var data = $(this).serialize();
            data['first'] = $('#first').val();
            data['second'] = $('#second').val();
            $.ajax({
                url: '/processdata',
                type: 'post',
                data: JSON.stringify({ Frames : data }),
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (returnedData) {

所以当我发布数据时,它看起来像是这样---

enter image description here

我想要的是当我发布数据---

["frames": {"first":6, "second": 7}, {"first": 4, "second": 9}]

有谁知道我在哪里弄错了! 任何建议都会非常明显......

1 个答案:

答案 0 :(得分:2)

var data = $(this).serialize();

这会将表单数据转换为字符串。

data['first'] = $('#first').val();
data['second'] = $('#second').val();

然后尝试向字符串添加属性,但仅针对DOM中每个元素的第一个匹配。

对此的简单解决方案是不使用JSON

  1. 摆脱输入中的id属性。禁止重复ID。
  2. 将名称更改为[]中的结尾,以处理PHP独特的表单处理系统
  3. 摆脱data['first'] = $('#first').val();
  4. 等所有行
  5. data: JSON.stringify({ Frames : data }),更改为data: data
  6. 摆脱contentType: "application/json; charset=utf-8",
  7. 将您的PHP更改为直接从$_POST读取而不是期待JSON格式化请求
  8. 如果您真的想使用JSON,那么您需要自己构建数据结构。

    您还会发现在work properly时制作表单JS fails还需要做更多工作。

      

    [&#34;帧&#34;:{&#34;第一&#34;:6,&#34;第二&#34;:7},{&#34;第一&#34;:4,& #34;第二个&#34;:9}]

    ......但这不是有效的JSON。

    你需要更像的东西:

    {"frames": [ {"first":6, "second": 7}, {"first": 4, "second": 9} ]}
    
    1. 摆脱输入中的id属性。禁止重复ID。
    2. 摆脱我在本回答顶部引用的所有内容
    3. 获取表单数据
      1. 创建一个数组(var data = []
      2. 获取表格行:var rows = jQuery('tr')是一个开头,但您可能希望更具体
      3. 对于每一行,获取所需的数据并将其添加到数组中:rows.each(function () { data.push({ first: jQuery(this).find("[name=first]").val(), second: jQuery(this).find("[name=second]").val() });