发送非空json数据作为自定义格式的查询字符串

Send non-empty json data as query string with custom format

本文关键字:格式 自定义 查询 字符串 json 数据      更新时间:2023-09-26

尝试通过GET发送json数据。
Json数据:

var data = {
    country: {
        name: "name",
        code: 1
    },
    department: {},
    cars: ["bmw", "ferrari"],
    books: []
}
发送代码:

var posting = $.ajax({
    url: "/do",
    type: "GET",
    traditional: true,
    data: data,
    dataType: "json"
});
posting.done(function (data) {
    // handle result
});

如果traditional=true(已解析、已解码)查询字符串为

country[name]:name
country[code]:1
cars[]:bmw
cars[]:ferrari

如果traditional=false(已解析、已解码)查询字符串为

country:[object Object]
department:[object Object]
cars:bmw
cars:ferrari

期望的应该是

country:{"name": "name", "code":1}
cars:bmw
cars:ferrari

country:{"name": "name", "code":1}
cars:["bmw", "ferrari"]

换句话说,应该省略空对象和数组。对象应该被正确编码。尝试了不同的contentType和JSON.stringify()没有运气。有办法吗?

根据我的理解,我理解的问题是在url中发送多维json数组。我在本地主机上测试以下代码。希望这对你有帮助。我比你的名气小得多,但我只是想帮忙。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<script>
var data = {
    country: {
        name: "name",
        code: 1
    },
    department: {},
    cars: ["bmw", "ferrari"],
    books: []
}
    data = $.param(data);
    var posting = $.ajax({
        url: "test.php",
        type: "GET",
        traditional: true,
        data: data,
        dataType: "json"
    });
    posting.done(function (data) {
        console.log(data);
    });
    </script>
PHP文件

    <?php
    echo "<pre>"; print_r($_REQUEST); echo "</pre>";
    ?>

结果我得到

<pre>Array
(
    [country] => Array
        (
            [name] => name
            [code] => 1
        )
    [cars] => Array
        (
            [0] => bmw
            [1] => ferrari
        )
)
</pre>

JS Fidle演示

var data = {
    country: {
        name: "name",
        code: 1
    },
    department: {},
    cars: ["bmw", "ferrari"],
    books: []
};
function isEmpty(obj) 
{
    for(var prop in obj) 
    {
        if(obj.hasOwnProperty(prop))
            return false;
    }
    return true;
}
function removeFirstLevelEmptyPropertiesFromJSON(obj)
{
  var isArray = obj instanceof Array;
  for (var k in obj)
  {
      if (obj[k] instanceof Array)  
      {
          if(obj[k].length == 0)
              delete obj[k];
      }
      else
      {
          if(isEmpty(obj[k]))
              delete obj[k];
      }
  }
}
removeFirstLevelEmptyPropertiesFromJSON(data);
var modifiedData = JSON.stringify(data);
alert(modifiedData);

我通过在一个键=值对中发送整个对象来更改发送json数据的逻辑:

$.each(data, function (key, value) {
    if ($.isEmptyObject(value)) {
        delete data[key];
    }
});
var posting = $.ajax({
    url: "/do",
    type: "GET",
    traditional: false,
    data: "data=" + JSON.stringify(data),
    dataType: "json"
});