在URLSearchParams中使用json对象

h5qlskok  于 2022-09-18  发布在  Java
关注(0)|答案(7)|浏览(126)

可以以某种方式将json对象附加到URLSearchParams对象上吗?

因此,与其说:

urlSearchParams.append('search', 'person');

它是:

urlSearchParams.append({search: "person"});

我的回答感谢Darshak Gajjar的回答

可以通过以下方式使用JSON对象:

let test_this = [{"search": "person"}, { search: "another person"}];
var json = JSON.stringify(test_this);
urlSearchParams.append("myobj", json);

return this.http.post(this.post_url, urlSearchParams, options) //options being your own RequestOptions
qyzbxkaa

qyzbxkaa1#

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

这样的东西也许能用urlSearchParams = Object.assign(urlSearchParams, {search: "person"});

编辑:使用普通的javascript的替代解决方案。此外,我认为URLSearchParams只是一个普通的js对象,但实际上您必须使用getsetappend来访问属性。

var params = new URLSearchParams("a=apple&b=balloon");
var parametersToAdd = {c: "car", d: "duck"};
for(key in parametersToAdd)
  params.append(key, parametersToAdd[key]);

console.log(params.get('c'));
console.log(params.get('d'));

编辑bis:.append()支持重复使用相同的键/参数名称,而.set()将覆盖以前的值。

9bfwbjaz

9bfwbjaz2#

可能正在使用以下代码,您可以在URL搜索参数中传递整个JSON对象

var json = JSON.stringify(myObj);

this.http.get('url'+'?myobj='+encodeURIComponent(json))
dy1byipe

dy1byipe3#

没有用于此的API。您只需枚举属性并手动追加它们,例如使用以下函数:

function appendParams(params: URLSearchParams, obj: any) {
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      params.append(key, obj[key])
    }
  }
}

appendParams(urlSearchParams, { search: 'person' });
enyaitl3

enyaitl34#

我想分享我对Angular2的回答,并选择发送Array。这就是我使用get函数的方式:

this.get('/api/database', {
   'age': [1,2,3,4]
})

这项服务大概是这样的:

get(url, _params = {}) {
    let params = this._processParams(_params);

    return this.http.get(url, params).toPromise();
}

_processParams(obj: any) {
        /* Convert this
            { age: [1,2,3] }
           To:
              param.append('age', 1);
              param.append('age', 2);
              param.append('age', 3);
        */        
        let params = new URLSearchParams();

        for (let key in obj) {
            for (let index in obj[key] ) {                
                params.append(key, obj[key][index]);
            }
        }

        return {
            search: params
        };
    }
rggaifut

rggaifut5#

const url = new URL('/', location.origin);
console.log(url.href); // https://stackoverflow.com/
Object.entries({this:4,that:1}).forEach((item)=>{ 
// note .set replaces while .append will duplicate params
    url.searchParams.append(...item);
});
console.log(url.href); // https://stackoverflow.com/?this=4&that=1
yftpprvb

yftpprvb6#

以下是我的做法。我们有一个简单的要求,其中对象只是一个键值对,其中的值可以是字符串或数组。我们还没有找到嵌套对象的用例。

因此,假设我们希望将此对象转换为查询字符串,反之亦然:

const input = {
  ini: 'ini',
  itu: 'itu',
  ayo: ['desc', 'asc'],
}

然后我们有两个函数来解析和串行化:

function stringify(input) {
  const params = new URLSearchParams();

  for (const key in input) {
    if (Array.isArray(input[key])) {
      input[key].forEach(val => {
        params.append(key + '[]', val)
      })
    } else {
      params.append(key, input[key]);
    }
  }

  return '?' + params.toString();
}
function parse(input) {
  const payload = {};
  const params = new URLSearchParams(input);

  for(let [key, val] of params.entries()) {
    if (key.endsWith('[]')) {
      key = key.replace(/\[\]$/, '');
      if (payload[key]) {
        payload[key].push(val);
      } else {
        payload[key] = [val]
      }
    } else {
      payload[key] = val;
    }
  }

  return payload;
}

所以结果应该是"?ini=ini&itu=itu&ayo%5B%5D=desc&ayo%5B%5D=asc"。这类似于本例中的数组格式。

请注意,这可能不是战斗测试,但对我们来说,我们并没有真正复杂的对象结构。

o75abkj4

o75abkj47#

超级简单答案/示例:

// Create:
const params = new URLSearchParams({a: 1, b: 2})
// OR
const params = new URLSearchParams("a=1&b=2")

// Append
params.append(c, 'woohoo') // Note: if c param already exists in params, this will replace it (won't be adding new param if already exists, hence no duplications)

// Print
params.toString() // Prints: 'a=1&b=2&c=woohoo'

相关问题