【问题标题】:Typescript can not read a map<string,string> from JSON dataTypescript 无法从 JSON 数据中读取 map<string,string>
【发布时间】:2019-03-07 13:09:07
【问题描述】:

我在 Spring Boot 应用程序上使用 Angular5。我正在尝试以 JSON 格式返回地图。

春天:

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

Angular5:

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: _this.sql_list.get is not a function

我在那里犯了什么错误?

编辑:遵循弗洛里安的回答,这是有效的:

this.sql_list = new Map<string, string>(Object.entries(data));

【问题讨论】:

    标签: json spring typescript angular5


    【解决方案1】:

    正如弗洛里安解释的那样,您将平面 JSON 对象分配给应该是 Map 的东西 如果您真的希望它成为Map,您可以做的一件事是做

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

    这将遍历您拥有的所有键('query1'、'query2'、'query3'),然后它将在您的地图中设置该键的值

    只是想知道您为什么使用Map,因为如果您已经知道您的对象的外观以及它将具有哪些字段,那么您为什么不创建一个类并将其键入为该类?

    只是一个建议。例如,当您在 VS Code 中编写代码时也更容易,您将拥有自动完成功能

    【讨论】:

      【解决方案2】:

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

      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 中的空Map 对象)的巧妙组合将返回的JavaScript 对象data“转换”为完整的Map 对象。

      【讨论】:

        【解决方案3】:

        当您执行this.sql_list = data 时,您会覆盖之前的sql_list,因此它不再是Map&lt;string, string&gt;。因为data 是一个普通的javascript 对象,所以sql_list 也是如此。

        您需要使用Map&lt;string, string&gt; 而不是普通对象的情况并不多,因为您可以通过像这样的索引来访问对象值:sql_list['query1']。要在 typescript 中实现这一点,您必须将 sql_list 声明为 any 类型,或者创建自己的类型,例如像这样的字符串映射器类型:

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

        那么你只需声明sql_list: strMap;

        如果你还有充分的理由使用Map&lt;string, string&gt;,可以看看this question

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-09-16
          • 2019-09-05
          • 2017-12-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-18
          相关资源
          最近更新 更多