【问题标题】:How to convert JSON to query string in angular2?如何将JSON转换为angular2中的查询字符串?
【发布时间】:2017-06-05 07:36:15
【问题描述】:

我是 Angular2 的新手。我有一个 JSON 对象,如下所示:

var options = {
  param1: "parama1",
  param2: "parama2",
  param3: "parama3"
};

应转换为查询字符串并附加到外部 URL 以重定向页面,如下所示:

ngOnInit(){
     window.location.href = someurl?param1=param1&param2=param2&param3=param3;
}

我正在寻找一种将其转换为查询字符串的方法。在 JQuery 中,$.param() 和 AngularJS 中的 $httpParamSerializerJQLike() 就是为此而生的。我搜索过,但我什么也没有。我想知道有没有办法在angular2中做到这一点。

【问题讨论】:

标签: json angular typescript query-string


【解决方案1】:

没有字符串 concats 的更“官方”的方法:

import {URLSearchParams} from '@angular/http'
let options = {
  param1: "param1",
  param2: "param2",
  param3: "param3"
};

let params = new URLSearchParams();
for(let key in options){
    params.set(key, options[key]) 
}

console.log("http://someUrl?" + params.toString());

顺便说一句,这会自动编码。

【讨论】:

  • @sitchie - 我拒绝了你提议的编辑。如果你使用这个方法,参数已经被 URLEncoded。
  • 我知道了,但没有办法恢复。
  • 仅供参考:直到最近,URLSearchParams 需要一个 polyfill 才能在某些浏览器(IE 和 Safari)中正确使用,有人知道这是否改变了吗?
  • URLSearchParams 现在被 HttpParams 弃用:angular.io/api/common/http/HttpParams
  • 看看我的回答如何使用HttpParams
【解决方案2】:

此解决方案适用于大多数复杂类型

如果有人想知道如何做到这一点,我编写了一个扩展,它应该与 c# .Net Core 1.1 和 Typescript 2.2.2 WebApi 一起使用,看起来像这样。

记得在你使用它的地方也包含这两个导入

import { URLSearchParams } from '@angular/http';
import 'rxjs/add/operator/map'

export class QueryStringBuilder {
    static BuildParametersFromSearch<T>(obj: T): URLSearchParams {
        let params: URLSearchParams = new URLSearchParams();

        if (obj == null)
        {
            return params;
        }

        QueryStringBuilder.PopulateSearchParams(params, '', obj);

        return params;
    }

    private static PopulateArray<T>(params: URLSearchParams, prefix: string, val: Array<T>) {
        for (let index in val) {
            let key = prefix + '[' + index + ']';
            let value: any = val[index];
            QueryStringBuilder.PopulateSearchParams(params, key, value);
        }
    }

    private static PopulateObject<T>(params: URLSearchParams, prefix: string, val: T) {
        const objectKeys = Object.keys(val) as Array<keyof T>;

        if (prefix) {
            prefix = prefix + '.';
        }

        for (let objKey of objectKeys) {

            let value = val[objKey];
            let key = prefix + objKey;

            QueryStringBuilder.PopulateSearchParams(params, key, value);
        }
    }

    private static PopulateSearchParams<T>(params: URLSearchParams, key: string, value: any) {
        if (value instanceof Array) {
            QueryStringBuilder.PopulateArray(params, key, value);
        }
        else if (value instanceof Date) {
            params.set(key, value.toISOString());
        }
        else if (value instanceof Object) {
            QueryStringBuilder.PopulateObject(params, key, value);
        }
        else {
            params.set(key, value.toString());
        }
    }

}

这适用于我目前使用的所有复杂类型。

编辑 UrlSearch 参数已被删除。以下是通过@NuryagdyMustapayev 的要点更新的更改:

static buildParametersFromSearch<T>(obj: T): HttpParams {
    let params: HttpParams= new HttpParams();

    if (obj == null)
    {
        return params;
    }

    return QueryStringBuilder.populateSearchParams(params, '', obj);
}

private static populateArray<T>(params: HttpParams, prefix: string, val: Array<T>): HttpParams {
    for (let index in val) {
        let key = prefix + '[' + index + ']';
        let value: any = val[index];
        params = QueryStringBuilder.populateSearchParams(params, key, value);
    }
    return params;
}

private static populateObject<T>(params: HttpParams, prefix: string, val: T): HttpParams {
    const objectKeys = Object.keys(val) as Array<keyof T>;

    for (let objKey of objectKeys) {

        let value = val[objKey];
        let key = prefix;
        if (prefix) {
            key += '[' + objKey + ']';
        } else {
            key += objKey;
        }

        params = QueryStringBuilder.populateSearchParams(params, key, value);
    }
    return params;
}

private static populateSearchParams<T>(params: HttpParams, key: string, value: any): HttpParams {
    if (value instanceof Array) {
        return QueryStringBuilder.populateArray(params, key, value);
    }
    else if (value instanceof Date) {
        return params.append(key, value.toISOString());
    }
    else if (value instanceof Object) {
        return QueryStringBuilder.populateObject(params, key, value);
    }
    else if ('undefined' !== typeof value && null !== value){
        return params.append(key, value.toString());
    }
    return params;
}

记得从“@angular/common/http”导入{HttpParams};

【讨论】:

  • 正如您使用唯一公共方法 BuildParametersFromSearch 调用的注释
  • URLSearchParams 被删除,HttpParams 被使用。我更新了您的代码以使用HttpParams 这是要点:gist.github.com/nuryagdym/9fe9ab4b3de3d5738d6f596ecf5db374
  • 我搞错了,你能不能把这行里的|| 换成else if ('undefined' !== typeof value || null !== value)&amp;&amp;,stackoverflow 不允许我提供编辑。
  • 嗯,我改变了它,但是,在阅读之后,我们确定要首先删除 null 或 undefined 值吗?一些模型绑定器不是依赖于值已定义的事实吗?
  • 它不会删除它,它只是返回 undefinednull 的值。否则,我得到Cannot read property 'toString' of null/undefined error
【解决方案3】:

这个怎么样:

ngOnInit(){
    let options = {
      param1: "param1",
      param2: "param2",
      param3: "param3"
    };

    let myQuery = 'http://someurl?'
    for (let entry in options) {
        myQuery += entry + '=' + encodeURIComponent(options[entry]) + '&';
    }

    // remove last '&'
    myQuery = myQuery.substring(0, myQuery.length-1)

    window.location.href = myQuery;
}

myQuery 的值为?param1=param1&amp;param2=param2&amp;param3=param3

【讨论】:

  • encodeURI("param1=param1&param2=param2&param3=param4.com") 给出“param1=param1&param2=param2&param3= param4.com”,它不是编码url
  • 您确定使用了相同的选项吗?检查这个 plunker:plnkr.co/edit/VvRr4yZkKu7YHhyvaOlb?p=preview 它在那里工作正常(检查 app.ts 和控制台)
  • 只要把任意一个url作为一个参数就可以看到结果了。
  • @sitchie param1=param1&amp;param2=param2&amp;param3=param4.com 似乎编码正确
【解决方案4】:

您可以使用HttpParams

import { HttpParams } from '@angular/common/http';

new HttpParams({fromObject: yourObject}).toString()

【讨论】:

    【解决方案5】:

    我不喜欢使用任何库,你可以简单地使用地图函数来创建它。

    所以这就是这个案例的用途:

    const params= {
     param1:"value1",
     param2:"value2",
     param2:"value2",
    };
    
    const queryStr = Object.keys(params).map((el)=>( `${el}=${params[el]}` )).join("&");
    

    这是输出:param1=value1&amp;param2=value2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-10
      • 2022-01-08
      • 2021-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多