代码之家  ›  专栏  ›  技术社区  ›  Logan Wlv

Typescript无法从JSON数据中读取map<string,string>

  •  1
  • Logan Wlv  · 技术社区  · 6 年前

    春天:

    //some method
    return ResponseEntity.ok((new Gson()).toJson(/*My map object*/));
    

    sql_list = new Map<string,string>();
    this.myService.getQueries().subscribe(
        data => {
            console.log("Received data: ");
            console.log(data);
            this.sql_list = data;
            console.log(this.sql_list.get("query1"));
        } 
    );
    

    在客户端中,我可以看到使用console.log可以很好地接收数据:

    Received data:
    {
      "query1" : "select * from test",
      "query2" : "select * from test2",
      "query3" : "select * from test3"
    }
    

    但是 sql_list map.get(string key) 方法:

    ERROR TypeError:\u this.sql\u list.get不是函数

    我犯了什么错误?

    编辑:

    this.sql_list = new Map<string, string>(Object.entries(data));
    
    3 回复  |  直到 6 年前
        1
  •  3
  •   Florian Albrecht    6 年前

    在第一行中,创建一个地图:

    sql_list = new Map<string,string>();
    

    但稍后,在数据处理程序中,您只需用接收到的数据覆盖该对象:

    this.sql_list = data;
    

    作为 data 如果是HTTP处理程序返回的内容,则很可能无法实现 Map 接口,不提供 get . 相反,它将是一个普通的JavaScript对象,您可以像 console.log(sql_list['query1'])

    你可以用一些巧妙的组合 Object.keys() set() 地图 对象存储在 sql_list )“转换”返回的JavaScript对象 数据 变成一个完整的 地图

        2
  •  4
  •   Nenad Jovicic    6 年前

    正如Florian所解释的,您正在将planejson对象分配给应该 Map 如果你真的想做的话,你可以做一件事 是做什么

    for (const key in data) {
        this.sql_list.set(key, data[key]);
    }
    

    这将遍历所有键(“query1”、“query2”、“query3”),然后在映射中设置该键的值

    地图

    只是个建议。当你用VS代码写代码时也会更容易,例如,你会有自动完成功能

        3
  •  2
  •   ShamPooSham    6 年前

    当你这么做的时候 this.sql_list = data ,你覆盖了什么 sql_list 以前是,所以现在不是了 Map<string, string> data 是一个普通的javascript对象,就是这样 sql\U列表

    你需要使用的案例并不多 sql_list['query1'] . 要在typescript中实现这一点,必须声明 sql\U列表 作为一个 any

    interface strMap {
      [key: string]: string;
    }
    

    那你就申报吧 sql_list: strMap;

    如果你还有充分的理由 ,你可以看看 this question